to do before publish

#remettre ligne de code general identification (trop long a calcul pour les test de knit) + remettre pour cluster 13 deux premiere ligne list..

#cluster 3 DP small, 8,10,16
#11 refaire text marqueur
#refaire cluster 13 avec annot one note pour petit iddentif des pop
#DP blast put cell cycle umap ? dans le fichier myc_pten_paper --> report mycpten..cccaintegration_modif

#revoir titre partie en fonction du papier
#refaire docker en verifiant que tout les librairies necessaire sont dowloand dedans

#verif tout comm sont bein en anglais

#CD8 vs CD4 remettre les calcul de fin marker pour le final et pas le load fichier qui est la poru gagner du temps
#loading final object obtain with Experiment_preprocessing
SAMPLE1 <- "181031"
SAMPLE2 <- "190211"

if(! file.exists(paste0(OUTPUT_PATH, "T-Seurat-merged_clean-subset",".Robj"))){
print("You should start with Experiment_preprocessing.Rmd or dowload our final object 'T-Seurat-merged_clean-subset.Robj' ")
do <- FALSE
}else{ 
print ("You are starting analysis of our final Seurat object")
load(paste0(OUTPUT_PATH, "T-Seurat-merged_clean-subset",".Robj"))
do <- TRUE
}

[1] “You are starting analysis of our final Seurat object”

Creating tissue subset

Thymus subset

Idents(T.Seurat) <- "HTO"
T.Seurat.thymus <- subset(T.Seurat, idents = c("Myc- PTEN- thymus","MYC- thymus","PTEN- thymus","WT thymus"))
a <- t(margin.table(table(T.Seurat.thymus@meta.data$HTO,T.Seurat.thymus@meta.data$integrated_snn_res.1.8),2))
T.Seurat.spleen <- subset(T.Seurat, idents = c("Myc- PTEN- spleen","MYC- spleen","PTEN- spleen","WT spleen"))
b <- t(margin.table(table(T.Seurat.spleen@meta.data$HTO,T.Seurat.spleen@meta.data$integrated_snn_res.1.8),2))
c <- t((a/(a+b)*100))
c
##     
##      [,1]      
##   0    8.204812
##   1   16.918967
##   2   99.730942
##   3   99.634369
##   4    2.474794
##   5    1.868132
##   6   77.661431
##   7   95.885510
##   8   99.564270
##   9    3.139013
##   10  38.990826
##   11   3.240741
##   12   1.960784
##   13  15.763547
##   14  82.543641
##   15   9.595960
##   16  44.074074
##   17  37.327189
##   18  98.913043
##   19   0.000000
##   20  94.771242
##   21  99.264706
##   22  80.882353
##   23 100.000000
#Thymic populations
thymus.clusters <- rownames(as.data.frame(c[which(c[,1]>25),]))
Idents(T.Seurat.thymus) <- "integrated_snn_res.1.8"
T.Seurat.thymus <- subset(T.Seurat.thymus, idents = thymus.clusters)
DimPlot(T.Seurat.thymus)

Spleen subset

#Spleen populations
as.data.frame(100-c[which(c[,1]<75),])
##    100 - c[which(c[, 1] < 75), ]
## 0                       91.79519
## 1                       83.08103
## 4                       97.52521
## 5                       98.13187
## 9                       96.86099
## 10                      61.00917
## 11                      96.75926
## 12                      98.03922
## 13                      84.23645
## 15                      90.40404
## 16                      55.92593
## 17                      62.67281
## 19                     100.00000
spleen.clusters <- rownames(as.data.frame(c[which(c[,1]<75),]))
Idents(T.Seurat.spleen) <- "integrated_snn_res.1.8"
T.Seurat.spleen <- subset(T.Seurat.spleen, idents = spleen.clusters)
DimPlot(T.Seurat.spleen)

Manual clustering

Based on several markers we are adjusting our clusterging, similar cluster are then annotate as one.

Thymic clusters :

#Look at differentiation markers on thymic clusters
DotPlot(T.Seurat.thymus, features = c("percent.mito","Bmf","Trp53inp1","Tox2","Cd5","Cd69","Cd27","Rag1","Rag2","Cd4","Cd8a","Cd8b1","Uchl3","Mki67","Cdk1","Ptcra","Il2ra","Cd34")) + scale_colour_gradient2(low = "steelblue", mid = "white", high = "red") + theme_dark(base_size = 14) + coord_flip()

#Regroup thymic clusters
#Similar cluster are annotate as one
Idents(T.Seurat.thymus) <- "integrated_snn_res.1.8"
T.Seurat.thymus@meta.data$manualclusters = "nothing"
T.Seurat.thymus@meta.data[WhichCells(T.Seurat.thymus, slot = "integrated_snn_res.1.8", idents = "22"),]$manualclusters = "22"
T.Seurat.thymus@meta.data[WhichCells(T.Seurat.thymus, slot = "integrated_snn_res.1.8", idents = "21"),]$manualclusters = "21"
T.Seurat.thymus@meta.data[WhichCells(T.Seurat.thymus, slot = "integrated_snn_res.1.8", idents = c("20","18","14")),]$manualclusters = "20,18,14"
T.Seurat.thymus@meta.data[WhichCells(T.Seurat.thymus, slot = "integrated_snn_res.1.8", idents = c("8","2","3","23")),]$manualclusters = "8,2,3,23"
T.Seurat.thymus@meta.data[WhichCells(T.Seurat.thymus, slot = "integrated_snn_res.1.8", idents = "6"),]$manualclusters = "6"
T.Seurat.thymus@meta.data[WhichCells(T.Seurat.thymus, slot = "integrated_snn_res.1.8", idents = "7"),]$manualclusters = "7"
T.Seurat.thymus@meta.data[WhichCells(T.Seurat.thymus, slot = "integrated_snn_res.1.8", idents = c("10","16")),]$manualclusters = "10,16"
T.Seurat.thymus@meta.data[WhichCells(T.Seurat.thymus, slot = "integrated_snn_res.1.8", idents = "17"),]$manualclusters = "17"

Splenic clusters :

#Look at differentiation markers on splenic clusters
DotPlot(T.Seurat.spleen, features = c("Aes","Anxa1","Ifng","Itgal","Foxp3","S1pr1","Sell","Ccr7","Trdc","Tcrg-C4","Tcrg-C2","Tcrg-C1","Trbc2","Trbc1","Trac","Cd8b1","Cd4")) + scale_colour_gradient2(low = "steelblue", mid = "white", high = "red") + theme_dark(base_size = 14) + coord_flip()

#Regroup splenic clusters
#Similar cluster are annotate as one
Idents(T.Seurat.spleen) <- "integrated_snn_res.1.8"
T.Seurat.spleen@meta.data$manualclusters = "nothing"
T.Seurat.spleen@meta.data[WhichCells(T.Seurat.spleen, slot = "integrated_snn_res.1.8", idents = "4"),]$manualclusters = "4"
T.Seurat.spleen@meta.data[WhichCells(T.Seurat.spleen, slot = "integrated_snn_res.1.8", idents = "1"),]$manualclusters = "1"
T.Seurat.spleen@meta.data[WhichCells(T.Seurat.spleen, slot = "integrated_snn_res.1.8", idents = "9"),]$manualclusters = "9"
T.Seurat.spleen@meta.data[WhichCells(T.Seurat.spleen, slot = "integrated_snn_res.1.8", idents = "12"),]$manualclusters = "12"
T.Seurat.spleen@meta.data[WhichCells(T.Seurat.spleen, slot = "integrated_snn_res.1.8", idents = "11"),]$manualclusters = "11"
T.Seurat.spleen@meta.data[WhichCells(T.Seurat.spleen, slot = "integrated_snn_res.1.8", idents = "19"),]$manualclusters = "19"
T.Seurat.spleen@meta.data[WhichCells(T.Seurat.spleen, slot = "integrated_snn_res.1.8", idents = "13"),]$manualclusters = "13"
T.Seurat.spleen@meta.data[WhichCells(T.Seurat.spleen, slot = "integrated_snn_res.1.8", idents = "17"),]$manualclusters = "17"
T.Seurat.spleen@meta.data[WhichCells(T.Seurat.spleen, slot = "integrated_snn_res.1.8", idents = c("10","16")),]$manualclusters = "10,16"
T.Seurat.spleen@meta.data[WhichCells(T.Seurat.spleen, slot = "integrated_snn_res.1.8", idents = "15"),]$manualclusters = "15"
T.Seurat.spleen@meta.data[WhichCells(T.Seurat.spleen, slot = "integrated_snn_res.1.8", idents = c("0","5")),]$manualclusters = "0,5"

Dot plot thymus

Setting thymic cluster order

Idents(T.Seurat.thymus) <- "manualclusters"
T.Seurat.thymus@active.ident <- factor(T.Seurat.thymus@active.ident,levels=c("22","21","20,18,14","8,2,3,23","7","6","10,16","17"))
levels(T.Seurat.thymus)
## [1] "22"       "21"       "20,18,14" "8,2,3,23" "7"        "6"       
## [7] "10,16"    "17"
DotPlot(T.Seurat.thymus, dot.scale = 8,features = c("percent.mito","Bmf","Trp53inp1","Tox2","Cd5","Cd69","Cd27","Rag1","Rag2","Cd4","Cd8a","Cd8b1","Mki67","Cdk1","Ptcra","Il2ra","Cd34")) + scale_colour_gradient2(low = "steelblue", mid = "white", high = "red") + coord_flip()+ theme(
  panel.background = element_rect(fill = "grey65",
                                size = 0.5, linetype = "solid"),
  panel.grid.major = element_line(size = 0.5, linetype = 'solid',
                                colour = "grey55"))

Dot plot spleen

Setting splenic cluster order

Idents(T.Seurat.spleen) <- "manualclusters"
T.Seurat.spleen@active.ident <- factor(T.Seurat.spleen@active.ident,levels=c("10,16","1","4","0,5","12","15","9","17","13","11","19"))
DotPlot(T.Seurat.spleen, dot.scale = 8, features= c("Foxp3","Aes","Anxa1","Gzma","Ccl5","Cxcr3","Sell","S1pr1","Ccr7","Trdc","Tcrg-C4","Tcrg-C2","Tcrg-C1","Trbc2","Trbc1","Trac","Cd8b1","Cd4")) + scale_colour_gradient2(low = "steelblue", mid = "white", high = "red") + theme(
  panel.background = element_rect(fill = "grey65",
                                size = 0.5, linetype = "solid"),
  panel.grid.major = element_line(size = 0.5, linetype = 'solid',
                                colour = "grey55")) + coord_flip()

Cluster Identification

General Identification markers

Idents(T.Seurat) <- "integrated_snn_res.1.8"
DefaultAssay(T.Seurat) <- "RNA"
#markerspleen <- FindAllMarkers(T.Seurat)

Detailed identification

Cluster 0

Idents(T.Seurat) <- "integrated_snn_res.1.8"
FeaturePlot(T.Seurat, features = c("adt_CD4","Sell","Cd8b1"),ncol = 3,cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"))

FeaturePlot(T.Seurat, features = c("Cd4","Cd8b1"),blend = T,
blend.threshold= 0.4,cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"))

Cluster 0 seems to contain naive SP4 cells (CD4+, Cd8- and CD62L-)

Cluster 1

FeaturePlot(T.Seurat, features = c("adt_CD4","Cd4","Cd8b1","Sell"),ncol = 4,cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"))

FeaturePlot(T.Seurat, features = c("Cd4","Cd8b1"),blend = T,
blend.threshold= 0.4,cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"))

Cluster 1 seems to contain CD8 naive T cells (CD4-, Cd8+ and CD62L-)

Cluster 2

FeaturePlot(T.Seurat, features = c("adt_CD4","Cd4","Cd8b1","Sell"),ncol = 4,cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"))

FeaturePlot(T.Seurat, features = c("Cd4","Cd8b1"),blend = T,
blend.threshold= 0.4,cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"))

Cluster 2 seems to contain DP cells (CD4+, CD8+, CD62L-)

Cluster 3

Cluster 4

FeaturePlot(T.Seurat, features = c("adt_CD4","Cd4","Cd8b1","Sell"),ncol = 4,cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"))

FeaturePlot(T.Seurat, features = c("Cd4","Cd8b1"),blend = T,
blend.threshold= 0.4,cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"))

Cluster 4 seems to contain CD8 naive T cells (CD4-, Cd8+, and CD62L-)

Cluster 5

FeaturePlot(T.Seurat, features = c("adt_CD4","Sell","Cd8b1"),ncol = 3,cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"))

FeaturePlot(T.Seurat, features = c("Cd4","Cd8b1"),blend = T,
blend.threshold= 0.4,cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"))

Cluster 5 seems to contain naive SP4 cells (CD4+, Cd8- and CD62L-)

Cluster 6

FeaturePlot(T.Seurat, features = c("percent.mito"),cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"), pt.size = 1)

Cluster 6 seems to contain dying cells

Cluster 7

FeaturePlot(T.Seurat, features = c("Cd69","Cd5","Satb1"),cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black")) #marker of TCR activation 

Seems to contain cells going from DP to SP between thymus and spleen

Cluster 8

Cluster 9

FeaturePlot(T.Seurat, features = c("Cd4","adt_CD4"))

VlnPlot(T.Seurat.spleen, features = c("Sell","Ccr7","Il7r","Cxcr3"),ncol=2) # Cxcr3 high on effector

Seems to contain CD4 eff (Cd4+, Sell-, Ccr7-, Cd127-)

Cluster 10

Cluster 11

FeaturePlot(T.Seurat, features = c("Cd8b1","Sell","Ccl5","adt_CD4"),cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"))

FeaturePlot(T.Seurat, features = c("Trac","Trbc1","Trdc","Tcrg-C1"),cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"))

FeaturePlot(T.Seurat, features = c("Ly6c2","Nkg7"),cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"))

VlnPlot(T.Seurat.spleen, features = c("Sell","Ccr7","Il7r"))

Cluster 11 Seems to contain CD8 mem cells & seem to contain Tgd cells & Ly6c2+

Cluster 12

FeaturePlot(T.Seurat, features = c("adt_CD4","Sell","Cd8b1"),cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"))

FeatureScatter(object = T.Seurat, feature1 = "adt_CD4", feature2 = "CD8", cells = colnames(subset(T.Seurat, idents = "0")), slot = "data")

Cluster 12 seems to contain naive SP4 cells (CD4+, Cd8- and CD62L -)

Cluster 13

plot1 <- DotPlot(cluster13, dot.scale = 10, features= c("Foxp3","Aes","Anxa1","Gzma","Ccl5","Cxcr3","Sell","S1pr1","Ccr7","Trdc","Tcrg-C4","Tcrg-C2","Tcrg-C1","Trbc2","Trbc1","Trac","Cd8b1","Cd4")) + scale_colour_gradient2(low = "steelblue", mid = "white", high = "red") + theme(
  panel.background = element_rect(fill = "grey65",
                                size = 0.5, linetype = "solid"),
  panel.grid.major = element_line(size = 0.5, linetype = 'solid',
                                colour = "grey55")) + coord_flip()
plot2 <- DotPlot(cluster13, dot.scale = 10, features= unique(top_genes_feature_plot$gene)) + scale_colour_gradient2(low = "steelblue", mid = "white", high = "red") + theme(
  panel.background = element_rect(fill = "grey65",
                                size = 0.5, linetype = "solid"),
  panel.grid.major = element_line(size = 0.5, linetype = 'solid',
                                colour = "grey55")) + coord_flip()
grid.arrange(plot1, plot2, ncol=2)

#table(cluster13@meta.data$integrated_snn_res.1)

This cluster is heterogeneous

Cluster 14

FeaturePlot(T.Seurat, features = c("adt_CD4","Cd4","Cd8b1"),cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"))

VlnPlot(T.Seurat, features = c("Pcna","Cdk1","Mki67")) #teichmann

Cluster 14 seems to be Dp blast

Cluster 15

FeaturePlot(T.Seurat, features = c("adt_CD4","Cd4","Foxp3","Il2ra"),cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"))

Cluster 15 seems to contain Treg (CD4+, Cd8-, Cd25+, Foxp3+)

Cluster 16

Cluster 17

FeaturePlot(T.Seurat, features = c("adt_CD4","Cd8b1","Trdc","Tcrg-C1"),cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"))

Cluster 17 seem to contain Tgd DN (CD4-, Cd8-, TCR D+, TCR G+)

Cluster 18

FeaturePlot(T.Seurat, features = c("adt_CD4","Cd4","Cd8b1"),cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"))

VlnPlot(T.Seurat, features = c("Pcna","Cdk1","Mki67")) #teichmann

Dp blast

Cluster 19

FeaturePlot(T.Seurat, features = c("Cd8b1","Sell","Ccl5","Gzma","Klrc1","Ifng","Zeb2","Ly6c2"),ncol = 3,cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"))

# Zeb2 terminally differentiated CTL
VlnPlot(T.Seurat.spleen, features = c("Sell","Ccr7","Il7r"))

Cluster 19 seemsto contain CD8 CTL (CD4-, Cd8+, Ccl5+, Sell-, ccr7-,cd127-) & Ly6c2+

Cluster 20

FeaturePlot(T.Seurat, features = c("adt_CD4","Cd4","Cd8b1"),cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"))

VlnPlot(T.Seurat, features = c("Pcna","Cdk1","Mki67")) #teichmann

Seems to be Dp blast

Cluster 21

FeaturePlot(T.Seurat, features = c("Cd8b1","adt_CD4"))

VlnPlot(T.Seurat, features = c("Cd8b1","adt_CD4"))

Cluster 21 seem to contain ISP cells (CD4-, Cd8+)

Cluster 22

FeaturePlot(T.Seurat, features = c("adt_CD4","Cd4","Cd8b1","Il2ra"),cols = c("grey", "light blue","cyan3","cyan4","dodgerblue3","blue","mediumslateblue","purple","orchid3","red","brown","black"))

Cluster 22 seems to contain DN T cells (CD4-, Cd8-, Cd25+)

Cluster 23

VlnPlot(T.Seurat, features = c("Cd8b1","adt_CD4"))

VlnPlot(T.Seurat, features = c("Rag1")) #on DP cells mostly (immgen), DP quicient or DP blast (Teichman)

Seems to be Dp small (Cd4+,Cd8+,Rag1+)

MYC vs WT

Radar plot

#check genotype proportion in each spleen clusters

df <- as.data.frame(as.data.frame.matrix(t(prop.table(table(T.Seurat.spleen@meta.data$HTO,T.Seurat.spleen@meta.data$manualclusters),1)*100)))
df$cluster = rownames(df)
df2<-as.data.frame(t(cbind(rep(60,11),rep(0,11),df)[,1:6]))
rownames(df2[1:2,]) <- c("60","0")

#order data frame
df2 <- df2[c("10,16","19","11","13","17","9","15","12","0,5","4","1")]

radarchart(df2, cglcol="grey", cglty=1 ,cglwd=0.8, vlcex=0.8, pcol=c("#FF99FF","coral1","cyan3","chartreuse3") , plwd=3, plty=1 ,caxislabels=paste(seq(from = 0,to = 60,by = 15),"%"), axislabcol = "grey40", axistype = 0)

#check genotype proportion in each thymic cluster
df <-  as.data.frame(as.data.frame.matrix(t(prop.table(table(T.Seurat.thymus@meta.data$HTO,T.Seurat.thymus@meta.data$manualclusters),1)*100)))
df$cluster = rownames(df)
df2<-as.data.frame(t(cbind(rep(65,8),rep(0,8),df)[,1:6]))
rownames(df2[1:2,]) <- c("65","0")

#order
df2 <- df2[c("22","17","10,16","6","7","8,2,3,23","20,18,14","21")]


radarchart(df2, cglcol="grey", cglty=1,caxislabels=paste(seq(0,70,17.5),"%"), axistype = 0,axislabcol="grey40", cglwd=0.8, vlcex=0.8, pcol=c("#FF99FF","coral1","cyan3","chartreuse3") , plwd=3, plty=1 )

### Proportion bar plot

#thymic proportions
datathym <- data.frame(prop.table(t(prop.table(table(T.Seurat.thymus@meta.data$HTO,T.Seurat.thymus@meta.data$manualclusters),1)),1)*100)
#order cluster level
datathym$Var1 <- factor(datathym$Var1, levels = c("22","21","20,18,14","8,2,3,23","7","6","10,16","17"))

cellnumber <- data.frame(colSums(table(T.Seurat.thymus@meta.data$HTO,T.Seurat.thymus@meta.data$manualclusters)) )
cellnumber$cluster <- rownames(cellnumber)
row_order <- c("22","21","20,18,14","8,2,3,23","6","7","17","10,16")
cellnumber <- cellnumber[row_order,]

Cluster <- datathym$Var1
HTO <- datathym$Var2
Percentage <- datathym$Freq
text <- cellnumber$colSums.table.T.Seurat.thymus.meta.data.HTO..T.Seurat.thymus.meta.data.manualclusters..

cols <- c("Myc- PTEN- thymus" = "#FF99FF", "MYC- thymus" = "coral1", "PTEN- thymus" = "cyan3", "WT thymus" = "chartreuse3")

ggplot(datathym, aes(fill=HTO, y=Percentage, x=Cluster)) + 
    geom_bar(position="stack", stat="identity", width=0.7)+
   xlab("Thymic Clusters")+ylab("Percentage")+ theme(legend.position="bottom")+ scale_fill_manual(values =cols, labels=c("Myc Pten","Myc","Pten","WT"))+theme_light()+geom_hline(yintercept=c(25,50,75), linetype="dashed", color = "grey60")+ annotate("text", x = c(1,2,3,4,5,6,7,8), y=103, label = c(paste0(text)))

#splenic proportions
Idents(T.Seurat.spleen) <- "manualclusters"
T.Seurat.spleenbar <- subset(T.Seurat.spleen,  idents = c("0,5","9","1","11","19")) #to only keep cluster needed for the plot
data3 <- data.frame(prop.table(t(prop.table(table(T.Seurat.spleenbar@meta.data$HTO,T.Seurat.spleenbar@meta.data$manualclusters),1)),1)*100)

#order cluster level
data3$Var1 <- factor(data3$Var1, levels = c("0,5","9","1","11","19"))

cellnumber <- data.frame(colSums(table(T.Seurat.spleen@meta.data$HTO,T.Seurat.spleen@meta.data$manualclusters)) )
cellnumber$cluster <- rownames(cellnumber)
row_order <-c("0,5","9","1","11","19")
cellnumber <- cellnumber[row_order,]

Cluster <- data3$Var1
HTO <- data3$Var2
Percentage <- data3$Freq
text <- cellnumber$colSums.table.T.Seurat.spleen.meta.data.HTO..T.Seurat.spleen.meta.data.manualclusters..
# Stacked bar plot
cols <- c("Myc- PTEN- spleen" = "#FF99FF", "MYC- spleen" = "coral1", "PTEN- spleen" = "cyan3", "WT spleen" = "chartreuse3")

ggplot(data3, aes(fill=HTO, y=Percentage, x=Cluster)) + 
    geom_bar(position="stack", stat="identity", width=0.7)+
   xlab("Splenic Clusters")+ylab("Percentage")+ theme(legend.position="bottom")+scale_fill_manual(values =cols, labels=c("Myc Pten","Myc","Pten","WT")) +theme_light()+geom_hline(yintercept=c(25,50,75), linetype="dashed", color = "grey60")+ annotate("text", x = c(1,2,3,4,5), y=103, label = c(text))

Differential Gene Expression

CD8

Idents(T.Seurat) <- "integrated_snn_res.1.8"
#DGE between our two CD8 naive clusters
dgecd8_data <- FindMarkers(T.Seurat, ident.1 = "1", ident.2 = "4",logfc.threshold=0)

# bar plot
#add abs value to table
dgecd8_data$abs <- abs(dgecd8_data$avg_logFC) 

dgecd8_data$genename <- rownames(dgecd8_data)
# Select markers for plotting on a Heatmap 
markers.use=subset(dgecd8_data, p_val_adj<1e-50 & abs>0.20)
dfcd8markers <-markers.use[order(markers.use$avg_logFC),]

dfcd8markers$genename <- factor(dfcd8markers$genename, levels = dfcd8markers$genename[order(dfcd8markers$avg_logFC)])
dfcd8markers$logpval <- log10(dfcd8markers$p_val_adj)

ggplot(dfcd8markers, aes(x = dfcd8markers$genename, y = dfcd8markers$avg_logFC, fill = logpval)) +   # Fill column
                              geom_bar(stat = "identity", width = .6) +   # draw the bars
                              ylim(-1.2,1.2)+
                              labs(title="Try dGE") +
                              theme_tufte() +  # Tufte theme from ggfortify
                              theme(plot.title = element_text(hjust = .5),axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1), 
                                    axis.ticks = element_blank()) +
                               scale_fill_gradient2(low='red', mid='orange', high='blue',midpoint = -120, breaks=c(-52,-120,-200),labels=c("-50","-120","-200"))+coord_flip() # Flip axes

#### CD4

#define proportion of genotype in CD4 naive clusters
T.Seurat.spleen@meta.data$manualHTO = "nothing"
Idents(T.Seurat.spleen) <- "MULTI_ID"
T.Seurat.spleen@meta.data[WhichCells(T.Seurat.spleen, slot = "MULTI_ID", idents = c("Spleen-ctrl","Spleen-P")),]$manualHTO = "Spleen-ctrl&P"
T.Seurat.spleen@meta.data[WhichCells(T.Seurat.spleen, slot = "MULTI_ID", idents = c("Spleen-M","Spleen-MP")),]$manualHTO = "Spleen-M&MP"

prop.table(t(prop.table(table(T.Seurat.spleen@meta.data$integrated_snn_res.1.8,T.Seurat.spleen@meta.data$manualHTO),1)),2)*100
##                
##                         0         1 2 3         4         5 6 7 8
##   Spleen-ctrl&P 17.473118 20.257235     94.642857 28.667413      
##   Spleen-M&MP   82.526882 79.742765      5.357143 71.332587      
##                
##                         9        10        11        12        13 14
##   Spleen-ctrl&P 75.000000 25.187970 33.732057 71.000000 60.818713   
##   Spleen-M&MP   25.000000 74.812030 66.267943 29.000000 39.181287   
##                
##                        15        16        17 18        19 20 21 22 23
##   Spleen-ctrl&P 43.016760 36.423841 17.647059    35.256410            
##   Spleen-M&MP   56.983240 63.576159 82.352941    64.743590
#in our CD4 naive clusters (0,5 and 12) the one with most cells from M&MP is 0 and the one with most cells from ctrl&P is 12

Idents(T.Seurat) <- "integrated_snn_res.1.8"
#DGE between 0 and 12
dgecd4_data <- FindMarkers(T.Seurat, ident.1 = "0", ident.2 = "12",logfc.threshold=0)
# bar plot
#add abs value to table
dgecd4_data$abs <- abs(dgecd4_data$avg_logFC) 

dgecd4_data$genename <- rownames(dgecd4_data)
# Select markers for plotting on a Heatmap 
markers.use=subset(dgecd4_data,p_val_adj<1e-10 & abs>0.2)
dfcd4markers <-markers.use[order(markers.use$avg_logFC),]

dfcd4markers$genename <- factor(dfcd4markers$genename, levels = dfcd4markers$genename[order(dfcd4markers$avg_logFC)])
dfcd4markers$logpval <- log10(dfcd4markers$p_val_adj)

ggplot(dfcd4markers, aes(x = dfcd4markers$genename, y = dfcd4markers$avg_logFC, fill = logpval)) +   # Fill column
                              geom_bar(stat = "identity", width = .6) +   # draw the bars
                              ylim(-1.2,1.2)+
                              labs(title="Try dGE CD4") +
                              theme_tufte() +  # Tufte theme from ggfortify
                              theme(plot.title = element_text(hjust = .5),axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1), 
                                    axis.ticks = element_blank()) +
                               scale_fill_gradient2(low='red', mid='orange', high='blue',midpoint = -40, breaks=c(-12,-40,-57),labels=c("-10","-40","-60"))+ coord_flip() # Flip axes

Functional profil analysis (Gene Ontology)

Idents(T.Seurat) <- "integrated_snn_res.1.8"

# get all gene name express in our cells as background
background <- T.Seurat@assays$RNA@meta.features
backgroundrow <- rownames(background)

Naive CD8 T cells

#DGE between our two CD8 naive clusters
#dgecd8_data <- FindMarkers(T.Seurat, ident.1 = "1", ident.2 = "4",logfc.threshold=0)
#upreg_cd8 <- subset(dgecd8_data, avg_logFC>0)
#downreg_cd8 <- subset(dgecd8_data, avg_logFC<0.2 & p_val_adj<1e-50)
#genecomprow <- rownames(downreg_cd8)


#### TO SUPPRESS FOR FINAL
#write.table(genecomprow,file="/home/nozaism/Workspace/01_These/01_Project/Myc_Pten_Paper/cluster1v4.txt",sep="\t",quote=F)
genecomprow <- read.table("/home/nozaism/Workspace/01_These/01_Project/Myc_Pten_Paper/cluster1v4.txt", sep = "\t")
genecomprow$x = as.character(genecomprow$x)
genecomprow <- genecomprow[,1]
####

CPenrich <- enrichGO(gene= genecomprow, OrgDb = 'org.Mm.eg.db', ont="BP",keyType = "SYMBOL",universe = backgroundrow) # org.Mm.eg.db genome mouse
head (CPenrich)
##                    ID                          Description GeneRatio
## GO:0002181 GO:0002181              cytoplasmic translation     16/51
## GO:0042254 GO:0042254                  ribosome biogenesis     21/51
## GO:0022613 GO:0022613 ribonucleoprotein complex biogenesis     22/51
## GO:0042274 GO:0042274   ribosomal small subunit biogenesis     13/51
## GO:0042255 GO:0042255                    ribosome assembly     13/51
## GO:0000028 GO:0000028     ribosomal small subunit assembly      8/51
##              BgRatio       pvalue     p.adjust       qvalue
## GO:0002181  79/13400 2.587342e-24 1.495484e-21 1.342694e-21
## GO:0042254 263/13400 4.286807e-23 1.238887e-20 1.112314e-20
## GO:0022613 397/13400 9.509083e-21 1.832083e-18 1.644904e-18
## GO:0042274  61/13400 3.841622e-20 5.551144e-18 4.983999e-18
## GO:0042255  66/13400 1.180651e-19 1.364832e-17 1.225391e-17
## GO:0000028  17/13400 5.863805e-16 5.648799e-14 5.071677e-14
##                                                                                                                                    geneID
## GO:0002181                                Rplp0/Rpl18a/Rps28/Rpl17/Rpl39/Rps2/Rps23/Rpl10a/Rpl15/Rplp1/Rpl8/Rpl18/Rpl36/Rpl24/Rps29/Rpl26
## GO:0042254       Rps19/Rplp0/Rps5/Rps28/Rps24/Rps7/Rps6/Rps2/Rpl23a/Rps16/Rpl3/Rpsa/Rps8/Rpl10a/Rpl12/Rps14/Rpl14/Rps10/Rps15/Rpl24/Rpl26
## GO:0022613 Rps19/Rplp0/Rps5/Rps28/Rps24/Rps7/Rps6/Rps2/Rpl23a/Rps16/Rpl3/Rpsa/Rps8/Rps23/Rpl10a/Rpl12/Rps14/Rpl14/Rps10/Rps15/Rpl24/Rpl26
## GO:0042274                                                        Rps19/Rps5/Rps28/Rps24/Rps7/Rps6/Rps2/Rps16/Rpsa/Rps8/Rps14/Rps10/Rps15
## GO:0042255                                                     Rps19/Rplp0/Rps5/Rps28/Rps2/Rpl23a/Rpl3/Rpsa/Rpl12/Rps14/Rps10/Rps15/Rpl24
## GO:0000028                                                                                   Rps19/Rps5/Rps28/Rps2/Rpsa/Rps14/Rps10/Rps15
##            Count
## GO:0002181    16
## GO:0042254    21
## GO:0022613    22
## GO:0042274    13
## GO:0042255    13
## GO:0000028     8
dotplot(CPenrich, showCategory=15,color = "p.adjust",x="count") #+ coord_flip()+theme(axis.text.x = element_text(angle = 90, hjust = 1))

emapplot(CPenrich, showCategory = 50)

Naive CD4 T cells

#DGE between our two most control and Myd del CD4 naive clusters
#dgecd4_data <- FindMarkers(T.Seurat, ident.1 = "0", ident.2 = "12",logfc.threshold=0)
#downreg_cd4 <- subset(dgecd4_data, avg_logFC<0& p_val_adj<1e-20)
#genecomprow <- rownames(downreg_cd4)


#### TO SUPPRESS FOR FINAL
#write.table(genecomprow,file="/home/nozaism/Workspace/01_These/01_Project/Myc_Pten_Paper/cluster0vs12.txt",sep="\t",quote=F)
genecomprow <- read.table("/home/nozaism/Workspace/01_These/01_Project/Myc_Pten_Paper/cluster1v4.txt", sep = "\t")
genecomprow$x = as.character(genecomprow$x)
genecomprow <- genecomprow[,1]
####


CPenrich <- enrichGO(gene= genecomprow, OrgDb = 'org.Mm.eg.db', ont="BP",keyType = "SYMBOL",universe = backgroundrow) # org.Mm.eg.db genome mouse

dotplot(CPenrich, showCategory=15,color = "p.adjust",x="count")

eYFP negative investigation

Deciphering what are our eYFP negative cells on effector and memory CD8 T cells

Heatmap :

# On cluster 11 - cd8 memory
C11Ctrl <-rownames(T.Seurat.spleen@meta.data[T.Seurat.spleen@meta.data$MULTI_ID == "Spleen-ctrl" & T.Seurat.spleen@meta.data$integrated_snn_res.1.8 == "11",])
mC11Ctrl <- mean(T.Seurat.spleen@assays$RNA@data["eYFP",C11Ctrl])
C11Pt <- rownames(T.Seurat.spleen@meta.data[T.Seurat.spleen@meta.data$MULTI_ID == "Spleen-P" & T.Seurat.spleen@meta.data$integrated_snn_res.1.8 == "11",])
mC11Pt <- mean(T.Seurat.spleen@assays$RNA@data["eYFP",C11Pt])
C11MP <- rownames(T.Seurat.spleen@meta.data[T.Seurat.spleen@meta.data$MULTI_ID == "Spleen-MP" & T.Seurat.spleen@meta.data$integrated_snn_res.1.8 == "11",])
mC11MP <- mean(T.Seurat.spleen@assays$RNA@data["eYFP",C11MP])
C11M <- rownames(T.Seurat.spleen@meta.data[T.Seurat.spleen@meta.data$MULTI_ID == "Spleen-M" & T.Seurat.spleen@meta.data$integrated_snn_res.1.8 == "11",])
mC11M <- mean(T.Seurat.spleen@assays$RNA@data["eYFP",C11M])
#on cluster 19 - cd8 eff term
C19Ctrl <-rownames(T.Seurat.spleen@meta.data[T.Seurat.spleen@meta.data$MULTI_ID == "Spleen-ctrl" & T.Seurat.spleen@meta.data$integrated_snn_res.1.8 == "19",])
mC19Ctrl <- mean(T.Seurat.spleen@assays$RNA@data["eYFP",C19Ctrl])
C19Pt <- rownames(T.Seurat.spleen@meta.data[T.Seurat.spleen@meta.data$MULTI_ID == "Spleen-P" & T.Seurat.spleen@meta.data$integrated_snn_res.1.8 == "19",])
mC19Pt <- mean(T.Seurat.spleen@assays$RNA@data["eYFP",C19Pt])
C19MP <- rownames(T.Seurat.spleen@meta.data[T.Seurat.spleen@meta.data$MULTI_ID == "Spleen-MP" & T.Seurat.spleen@meta.data$integrated_snn_res.1.8 == "19",])
mC19MP <- mean(T.Seurat.spleen@assays$RNA@data["eYFP",C19MP])
C19M <- rownames(T.Seurat.spleen@meta.data[T.Seurat.spleen@meta.data$MULTI_ID == "Spleen-M" & T.Seurat.spleen@meta.data$integrated_snn_res.1.8 == "19",])
mC19M <- mean(T.Seurat.spleen@assays$RNA@data["eYFP",C19M])
#on cluster 1
C1Ctrl <-rownames(T.Seurat.spleen@meta.data[T.Seurat.spleen@meta.data$MULTI_ID == "Spleen-ctrl" & T.Seurat.spleen@meta.data$integrated_snn_res.1.8 == "1",])
mC1Ctrl <- mean(T.Seurat.spleen@assays$RNA@data["eYFP",C1Ctrl])
C1Pt <- rownames(T.Seurat.spleen@meta.data[T.Seurat.spleen@meta.data$MULTI_ID == "Spleen-P" & T.Seurat.spleen@meta.data$integrated_snn_res.1.8 == "1",])
mC1Pt <- mean(T.Seurat.spleen@assays$RNA@data["eYFP",C1Pt])
C1MP <- rownames(T.Seurat.spleen@meta.data[T.Seurat.spleen@meta.data$MULTI_ID == "Spleen-MP" & T.Seurat.spleen@meta.data$integrated_snn_res.1.8 == "1",])
mC1MP <- mean(T.Seurat.spleen@assays$RNA@data["eYFP",C1MP])
C1M <- rownames(T.Seurat.spleen@meta.data[T.Seurat.spleen@meta.data$MULTI_ID == "Spleen-M" & T.Seurat.spleen@meta.data$integrated_snn_res.1.8 == "1",])
mC1M <- mean(T.Seurat.spleen@assays$RNA@data["eYFP",C1M])


l1 <- c("1","1","1","1","11","11","11","11","19","19","19","19")
l2 <- c("Ctrl","Pten","Myc","MycPten","Ctrl","Pten","Myc","MycPten","Ctrl","Pten","Myc","MycPten")
l3 <- c(mC1Ctrl,mC1Pt,mC1M,mC1MP,mC11Ctrl,mC11Pt,mC11M,mC11MP,mC19Ctrl,mC19Pt,mC19M,mC19MP)

tableauYFP <- data.frame(Cluster = l1, Genotypes =l2) 
tableauYFP <- cbind(tableauYFP,Values = l3)


tableauYFP$Cluster <- factor(tableauYFP$Cluster,levels = c("1","11","19"))
tableauYFP$Genotypes <- factor(tableauYFP$Genotypes,levels = c("MycPten","Myc","Pten","Ctrl"))
ggplot(tableauYFP, aes(x = Cluster, Genotypes)) +
        geom_tile(aes(fill = Values)) +
        scale_fill_gradient2( mid='yellow', high='red',limits=c(0,max(tableauYFP$Values)))+ theme_classic(base_size=20)

eYFP neagtive are coming from Myc and Myc Pten del mice

#DOT plot eyFP and TGD on CD8 effector and memory
Idents(T.Seurat.spleen) <- "integrated_snn_res.1.8"
CD8sub <- subset(T.Seurat.spleen, idents = c("11","19","13"))
Idents(CD8sub) <- "MULTI_ID"
CD8sub@active.ident <- factor(CD8sub@active.ident,levels=c("Spleen-M","Spleen-MP","Spleen-ctrl","Spleen-P"))
levels(CD8sub)
## [1] "Spleen-M"    "Spleen-MP"   "Spleen-ctrl" "Spleen-P"
DotPlot(CD8sub, dot.scale = 8,features = c("Tcrg-C1","Trdc","Trbc2","Trac","eYFP") ) + scale_colour_gradient2(low = "steelblue", mid = "white", high = "red")+ ggtitle("CD8 memory and effector clusters")

eyFP negative are coming from Myc and Myc Pten del mice and are Tgd cells.

Session Info

sessionInfo()
## R version 3.5.3 (2019-03-11)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 16.04.5 LTS
## 
## Matrix products: default
## BLAS/LAPACK: /usr/lib/libopenblasp-r0.2.18.so
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
##  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=C             
##  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] parallel  stats4    stats     graphics  grDevices utils     datasets 
## [8] methods   base     
## 
## other attached packages:
##  [1] org.Mm.eg.db_3.7.0     AnnotationDbi_1.44.0   IRanges_2.16.0        
##  [4] S4Vectors_0.20.1       Biobase_2.42.0         BiocGenerics_0.28.0   
##  [7] knitr_1.23             RColorBrewer_1.1-2     magrittr_1.5          
## [10] dplyr_0.8.1            ggthemes_4.2.0         clusterProfiler_3.10.1
## [13] enrichplot_1.2.0       fmsb_0.6.3             gridExtra_2.3         
## [16] kableExtra_1.1.0       plotly_4.9.0           ggplot2_3.1.1         
## [19] Seurat_3.0.1          
## 
## loaded via a namespace (and not attached):
##   [1] fastmatch_1.1-0     plyr_1.8.4          igraph_1.2.4.1     
##   [4] lazyeval_0.2.2      splines_3.5.3       BiocParallel_1.16.6
##   [7] listenv_0.7.0       urltools_1.7.3      digest_0.6.19      
##  [10] htmltools_0.3.6     GOSemSim_2.8.0      viridis_0.5.1      
##  [13] GO.db_3.7.0         gdata_2.18.0        memoise_1.1.0      
##  [16] cluster_2.0.9       ROCR_1.0-7          globals_0.12.4     
##  [19] readr_1.3.1         graphlayouts_0.6.0  R.utils_2.8.0      
##  [22] prettyunits_1.0.2   colorspace_1.4-1    blob_1.1.1         
##  [25] rvest_0.3.4         ggrepel_0.8.1       xfun_0.7           
##  [28] crayon_1.3.4        jsonlite_1.6        survival_2.44-1.1  
##  [31] zoo_1.8-5           ape_5.3             glue_1.3.1         
##  [34] polyclip_1.10-0     gtable_0.3.0        webshot_0.5.1      
##  [37] UpSetR_1.4.0        future.apply_1.2.0  scales_1.0.0       
##  [40] DOSE_3.8.2          DBI_1.0.0           bibtex_0.4.2       
##  [43] Rcpp_1.0.1          metap_1.1           viridisLite_0.3.0  
##  [46] progress_1.2.2      gridGraphics_0.5-0  reticulate_1.12    
##  [49] bit_1.1-14          europepmc_0.3       rsvd_1.0.0         
##  [52] SDMTools_1.1-221.1  tsne_0.1-3          htmlwidgets_1.3    
##  [55] httr_1.4.0          fgsea_1.8.0         gplots_3.0.1.1     
##  [58] ica_1.0-2           pkgconfig_2.0.2     R.methodsS3_1.7.1  
##  [61] farver_2.0.3        labeling_0.3        ggplotify_0.0.5    
##  [64] tidyselect_0.2.5    rlang_0.3.4         reshape2_1.4.3     
##  [67] munsell_0.5.0       tools_3.5.3         RSQLite_2.1.1      
##  [70] ggridges_0.5.1      evaluate_0.13       stringr_1.4.0      
##  [73] yaml_2.2.0          npsurv_0.4-0        bit64_0.9-7        
##  [76] fitdistrplus_1.0-14 tidygraph_1.1.2     caTools_1.17.1.2   
##  [79] purrr_0.3.2         RANN_2.6.1          ggraph_2.0.2       
##  [82] pbapply_1.4-0       future_1.13.0       nlme_3.1-140       
##  [85] R.oo_1.22.0         DO.db_2.9           xml2_1.2.0         
##  [88] compiler_3.5.3      rstudioapi_0.10     png_0.1-7          
##  [91] lsei_1.2-0          tibble_2.1.1        tweenr_1.0.1       
##  [94] stringi_1.4.3       lattice_0.20-38     Matrix_1.2-17      
##  [97] pillar_1.4.0        BiocManager_1.30.4  Rdpack_0.11-0      
## [100] triebeard_0.3.0     lmtest_0.9-37       data.table_1.12.2  
## [103] cowplot_0.9.4       bitops_1.0-6        irlba_2.3.3        
## [106] gbRd_0.4-11         qvalue_2.14.1       R6_2.4.0           
## [109] KernSmooth_2.23-15  codetools_0.2-16    MASS_7.3-51.4      
## [112] gtools_3.8.1        assertthat_0.2.1    withr_2.1.2        
## [115] sctransform_0.2.0   hms_0.4.2           grid_3.5.3         
## [118] tidyr_0.8.3         rmarkdown_1.12      rvcheck_0.1.8      
## [121] Rtsne_0.15          ggforce_0.3.1       base64enc_0.1-3
LS0tCnRpdGxlOiAiRXhwZXJpbWVudF9hbmFseXNpcyIKYXV0aG9yOiAiRGVscGhpbmUgUG90aWVyIC8gTWF0aGlzIE5vemFpcyAvIFNhcmFuIFBhbmthZXciCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICAKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoubWFpbi1jb250YWluZXIgewogIG1heC13aWR0aDogMTgwMHB4OwogIG1hcmdpbi1sZWZ0OiBhdXRvOwogIG1hcmdpbi1yaWdodDogYXV0bzsKfQo8L3N0eWxlPgoKYGBge3IgZ2xvYmFsLW9wdGlvbnMsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldCh3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLGZpZy5hbGlnbiA9ICdjZW50ZXInKQpgYGAKCgojdG8gZG8gYmVmb3JlIHB1Ymxpc2gKYGBge3J9CiNyZW1ldHRyZSBsaWduZSBkZSBjb2RlIGdlbmVyYWwgaWRlbnRpZmljYXRpb24gKHRyb3AgbG9uZyBhIGNhbGN1bCBwb3VyIGxlcyB0ZXN0IGRlIGtuaXQpICsgcmVtZXR0cmUgcG91ciBjbHVzdGVyIDEzIGRldXggcHJlbWllcmUgbGlnbmUgbGlzdC4uCgojY2x1c3RlciAzIERQIHNtYWxsLCA4LDEwLDE2CiMxMSByZWZhaXJlIHRleHQgbWFycXVldXIKI3JlZmFpcmUgY2x1c3RlciAxMyBhdmVjIGFubm90IG9uZSBub3RlIHBvdXIgcGV0aXQgaWRkZW50aWYgZGVzIHBvcAojRFAgYmxhc3QgcHV0IGNlbGwgY3ljbGUgdW1hcCA/IGRhbnMgbGUgZmljaGllciBteWNfcHRlbl9wYXBlciAtLT4gcmVwb3J0IG15Y3B0ZW4uLmNjY2FpbnRlZ3JhdGlvbl9tb2RpZgoKI3Jldm9pciB0aXRyZSBwYXJ0aWUgZW4gZm9uY3Rpb24gZHUgcGFwaWVyCiNyZWZhaXJlIGRvY2tlciBlbiB2ZXJpZmlhbnQgcXVlIHRvdXQgbGVzIGxpYnJhaXJpZXMgbmVjZXNzYWlyZSBzb250IGRvd2xvYW5kIGRlZGFucwoKI3ZlcmlmIHRvdXQgY29tbSBzb250IGJlaW4gZW4gYW5nbGFpcwoKI0NEOCB2cyBDRDQgcmVtZXR0cmUgbGVzIGNhbGN1bCBkZSBmaW4gbWFya2VyIHBvdXIgbGUgZmluYWwgZXQgcGFzIGxlIGxvYWQgZmljaGllciBxdWkgZXN0IGxhIHBvcnUgZ2FnbmVyIGR1IHRlbXBzCmBgYAoKCgpgYGB7ciBlbnZfbG9hZGluZywgaW5jbHVkZT1GQUxTRX0KIyBMb2FkIHBhY2thZ2VzLCBkYXRhIGFuZCBmdW5jdGlvbnMKbGlicmFyeShTZXVyYXQpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShncmlkRXh0cmEpCiNpbnN0YWxsLnBhY2thZ2VzKCJmbXNiIikKbGlicmFyeShmbXNiKQpCaW9jTWFuYWdlcjo6aW5zdGFsbCgiY2x1c3RlclByb2ZpbGVyIikKQmlvY01hbmFnZXI6Omluc3RhbGwoImVucmljaHBsb3QiKQpsaWJyYXJ5KGVucmljaHBsb3QpCmxpYnJhcnkoY2x1c3RlclByb2ZpbGVyKQojbGlicmFyeShnZ3JlcGVsKQojaW5zdGFsbC5wYWNrYWdlcygidGlkeXIiKQojbGlicmFyeSgidGlkeXIiKQppbnN0YWxsLnBhY2thZ2VzKCJnZ3RoZW1lcyIpCmxpYnJhcnkoZ2d0aGVtZXMpCiNsaWJyYXJ5KHNjYWxlcykKCgoKI1BhdGggdG8gdGhlIGFuYWx5c2lzIGZvbGRlcgpXT1JLU1BBQ0UgPC0gIi9ob21lL25vemFpc20vV29ya3NwYWNlLzAxX1RoZXNlLzAxX1Byb2plY3QvTXljX1B0ZW5fUGFwZXIvTXljX3JlcG8vIgojIFBhdGggdG8gdGhlIGZvbGRlciBjb250YWluaW5nIHNjcmlwdHMgdXNlZCBpbiB0aGUgYW5hbHlzaXMKQ1dEIDwtICIvaG9tZS9ub3phaXNtL1dvcmtzcGFjZS9GdW5jdGlvbl9kZWxwaGluZS8iIAojIExvYWQgdGhlIFIgc2NyaXB0cyBjb250YWluaW5nIHRoZSBmdW5jdGlvbnMgdXNlZCBpbiB0aGUgYW5hbHlzaXMKc291cmNlKHBhc3RlKENXRCwgIldvcmtmbG93X2Z1bmN0aW9uc19TMy5SIiwgc2VwPSIvIikpCiMgIFBhdGggdG8gdGhlIGZvbGRlciB0aGF0IHdpbGwgY29udGFpbiBvdXRwdXQgb2JqZWN0cwpPVVRQVVRfUEFUSCA8LSAocGFzdGUwKFdPUktTUEFDRSwiMDJfU2V1cmF0X2FuYWx5c2lzLzAyX091dHB1dC8iKSkKIyBTZXQgdGhlIHJhbmRvbSBudW1iZXIgc2VlZApzZXQuc2VlZCgxMjM0KQojIFJlc29sdXRpb24gcGFyYW1ldGVyIGZvciBTZXVyYXQgY2x1c3RlcmluZwpSRVNPTFVUSU9OIDwtIDEKYGBgCgpgYGB7cixyZXN1bHRzPSdhc2lzJ30KI2xvYWRpbmcgZmluYWwgb2JqZWN0IG9idGFpbiB3aXRoIEV4cGVyaW1lbnRfcHJlcHJvY2Vzc2luZwpTQU1QTEUxIDwtICIxODEwMzEiClNBTVBMRTIgPC0gIjE5MDIxMSIKCmlmKCEgZmlsZS5leGlzdHMocGFzdGUwKE9VVFBVVF9QQVRILCAiVC1TZXVyYXQtbWVyZ2VkX2NsZWFuLXN1YnNldCIsIi5Sb2JqIikpKXsKcHJpbnQoIllvdSBzaG91bGQgc3RhcnQgd2l0aCBFeHBlcmltZW50X3ByZXByb2Nlc3NpbmcuUm1kIG9yIGRvd2xvYWQgb3VyIGZpbmFsIG9iamVjdCAnVC1TZXVyYXQtbWVyZ2VkX2NsZWFuLXN1YnNldC5Sb2JqJyAiKQpkbyA8LSBGQUxTRQp9ZWxzZXsgCnByaW50ICgiWW91IGFyZSBzdGFydGluZyBhbmFseXNpcyBvZiBvdXIgZmluYWwgU2V1cmF0IG9iamVjdCIpCmxvYWQocGFzdGUwKE9VVFBVVF9QQVRILCAiVC1TZXVyYXQtbWVyZ2VkX2NsZWFuLXN1YnNldCIsIi5Sb2JqIikpCmRvIDwtIFRSVUUKfQoKYGBgCgoKYGBge2FzaXMsIGV2YWw9KGRvID09IFRSVUUgKSwgZWNobz1UUlVFfQojIENyZWF0aW5nIHRpc3N1ZSBzdWJzZXQKIyMgVGh5bXVzIHN1YnNldApgYGAKCmBgYHtyLGV2YWw9KGRvID09IFRSVUUgKX0KSWRlbnRzKFQuU2V1cmF0KSA8LSAiSFRPIgpULlNldXJhdC50aHltdXMgPC0gc3Vic2V0KFQuU2V1cmF0LCBpZGVudHMgPSBjKCJNeWMtIFBURU4tIHRoeW11cyIsIk1ZQy0gdGh5bXVzIiwiUFRFTi0gdGh5bXVzIiwiV1QgdGh5bXVzIikpCmEgPC0gdChtYXJnaW4udGFibGUodGFibGUoVC5TZXVyYXQudGh5bXVzQG1ldGEuZGF0YSRIVE8sVC5TZXVyYXQudGh5bXVzQG1ldGEuZGF0YSRpbnRlZ3JhdGVkX3Nubl9yZXMuMS44KSwyKSkKVC5TZXVyYXQuc3BsZWVuIDwtIHN1YnNldChULlNldXJhdCwgaWRlbnRzID0gYygiTXljLSBQVEVOLSBzcGxlZW4iLCJNWUMtIHNwbGVlbiIsIlBURU4tIHNwbGVlbiIsIldUIHNwbGVlbiIpKQpiIDwtIHQobWFyZ2luLnRhYmxlKHRhYmxlKFQuU2V1cmF0LnNwbGVlbkBtZXRhLmRhdGEkSFRPLFQuU2V1cmF0LnNwbGVlbkBtZXRhLmRhdGEkaW50ZWdyYXRlZF9zbm5fcmVzLjEuOCksMikpCmMgPC0gdCgoYS8oYStiKSoxMDApKQpjCiNUaHltaWMgcG9wdWxhdGlvbnMKdGh5bXVzLmNsdXN0ZXJzIDwtIHJvd25hbWVzKGFzLmRhdGEuZnJhbWUoY1t3aGljaChjWywxXT4yNSksXSkpCklkZW50cyhULlNldXJhdC50aHltdXMpIDwtICJpbnRlZ3JhdGVkX3Nubl9yZXMuMS44IgpULlNldXJhdC50aHltdXMgPC0gc3Vic2V0KFQuU2V1cmF0LnRoeW11cywgaWRlbnRzID0gdGh5bXVzLmNsdXN0ZXJzKQpEaW1QbG90KFQuU2V1cmF0LnRoeW11cykKYGBgCgpgYGB7YXNpcywgZXZhbD0oZG8gPT0gVFJVRSApLCBlY2hvPVRSVUV9CiMjIFNwbGVlbiBzdWJzZXQKYGBgCgoKYGBge3J9CiNTcGxlZW4gcG9wdWxhdGlvbnMKYXMuZGF0YS5mcmFtZSgxMDAtY1t3aGljaChjWywxXTw3NSksXSkKc3BsZWVuLmNsdXN0ZXJzIDwtIHJvd25hbWVzKGFzLmRhdGEuZnJhbWUoY1t3aGljaChjWywxXTw3NSksXSkpCklkZW50cyhULlNldXJhdC5zcGxlZW4pIDwtICJpbnRlZ3JhdGVkX3Nubl9yZXMuMS44IgpULlNldXJhdC5zcGxlZW4gPC0gc3Vic2V0KFQuU2V1cmF0LnNwbGVlbiwgaWRlbnRzID0gc3BsZWVuLmNsdXN0ZXJzKQpEaW1QbG90KFQuU2V1cmF0LnNwbGVlbikKYGBgCgojIE1hbnVhbCBjbHVzdGVyaW5nCkJhc2VkIG9uIHNldmVyYWwgbWFya2VycyB3ZSBhcmUgYWRqdXN0aW5nIG91ciBjbHVzdGVyZ2luZywgc2ltaWxhciBjbHVzdGVyIGFyZSB0aGVuIGFubm90YXRlIGFzIG9uZS4KClRoeW1pYyBjbHVzdGVycyA6CmBgYHtyfQojTG9vayBhdCBkaWZmZXJlbnRpYXRpb24gbWFya2VycyBvbiB0aHltaWMgY2x1c3RlcnMKRG90UGxvdChULlNldXJhdC50aHltdXMsIGZlYXR1cmVzID0gYygicGVyY2VudC5taXRvIiwiQm1mIiwiVHJwNTNpbnAxIiwiVG94MiIsIkNkNSIsIkNkNjkiLCJDZDI3IiwiUmFnMSIsIlJhZzIiLCJDZDQiLCJDZDhhIiwiQ2Q4YjEiLCJVY2hsMyIsIk1raTY3IiwiQ2RrMSIsIlB0Y3JhIiwiSWwycmEiLCJDZDM0IikpICsgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3cgPSAic3RlZWxibHVlIiwgbWlkID0gIndoaXRlIiwgaGlnaCA9ICJyZWQiKSArIHRoZW1lX2RhcmsoYmFzZV9zaXplID0gMTQpICsgY29vcmRfZmxpcCgpCgojUmVncm91cCB0aHltaWMgY2x1c3RlcnMKI1NpbWlsYXIgY2x1c3RlciBhcmUgYW5ub3RhdGUgYXMgb25lCklkZW50cyhULlNldXJhdC50aHltdXMpIDwtICJpbnRlZ3JhdGVkX3Nubl9yZXMuMS44IgpULlNldXJhdC50aHltdXNAbWV0YS5kYXRhJG1hbnVhbGNsdXN0ZXJzID0gIm5vdGhpbmciClQuU2V1cmF0LnRoeW11c0BtZXRhLmRhdGFbV2hpY2hDZWxscyhULlNldXJhdC50aHltdXMsIHNsb3QgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEuOCIsIGlkZW50cyA9ICIyMiIpLF0kbWFudWFsY2x1c3RlcnMgPSAiMjIiClQuU2V1cmF0LnRoeW11c0BtZXRhLmRhdGFbV2hpY2hDZWxscyhULlNldXJhdC50aHltdXMsIHNsb3QgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEuOCIsIGlkZW50cyA9ICIyMSIpLF0kbWFudWFsY2x1c3RlcnMgPSAiMjEiClQuU2V1cmF0LnRoeW11c0BtZXRhLmRhdGFbV2hpY2hDZWxscyhULlNldXJhdC50aHltdXMsIHNsb3QgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEuOCIsIGlkZW50cyA9IGMoIjIwIiwiMTgiLCIxNCIpKSxdJG1hbnVhbGNsdXN0ZXJzID0gIjIwLDE4LDE0IgpULlNldXJhdC50aHltdXNAbWV0YS5kYXRhW1doaWNoQ2VsbHMoVC5TZXVyYXQudGh5bXVzLCBzbG90ID0gImludGVncmF0ZWRfc25uX3Jlcy4xLjgiLCBpZGVudHMgPSBjKCI4IiwiMiIsIjMiLCIyMyIpKSxdJG1hbnVhbGNsdXN0ZXJzID0gIjgsMiwzLDIzIgpULlNldXJhdC50aHltdXNAbWV0YS5kYXRhW1doaWNoQ2VsbHMoVC5TZXVyYXQudGh5bXVzLCBzbG90ID0gImludGVncmF0ZWRfc25uX3Jlcy4xLjgiLCBpZGVudHMgPSAiNiIpLF0kbWFudWFsY2x1c3RlcnMgPSAiNiIKVC5TZXVyYXQudGh5bXVzQG1ldGEuZGF0YVtXaGljaENlbGxzKFQuU2V1cmF0LnRoeW11cywgc2xvdCA9ICJpbnRlZ3JhdGVkX3Nubl9yZXMuMS44IiwgaWRlbnRzID0gIjciKSxdJG1hbnVhbGNsdXN0ZXJzID0gIjciClQuU2V1cmF0LnRoeW11c0BtZXRhLmRhdGFbV2hpY2hDZWxscyhULlNldXJhdC50aHltdXMsIHNsb3QgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEuOCIsIGlkZW50cyA9IGMoIjEwIiwiMTYiKSksXSRtYW51YWxjbHVzdGVycyA9ICIxMCwxNiIKVC5TZXVyYXQudGh5bXVzQG1ldGEuZGF0YVtXaGljaENlbGxzKFQuU2V1cmF0LnRoeW11cywgc2xvdCA9ICJpbnRlZ3JhdGVkX3Nubl9yZXMuMS44IiwgaWRlbnRzID0gIjE3IiksXSRtYW51YWxjbHVzdGVycyA9ICIxNyIKYGBgCgpTcGxlbmljIGNsdXN0ZXJzIDoKYGBge3J9CgojTG9vayBhdCBkaWZmZXJlbnRpYXRpb24gbWFya2VycyBvbiBzcGxlbmljIGNsdXN0ZXJzCkRvdFBsb3QoVC5TZXVyYXQuc3BsZWVuLCBmZWF0dXJlcyA9IGMoIkFlcyIsIkFueGExIiwiSWZuZyIsIkl0Z2FsIiwiRm94cDMiLCJTMXByMSIsIlNlbGwiLCJDY3I3IiwiVHJkYyIsIlRjcmctQzQiLCJUY3JnLUMyIiwiVGNyZy1DMSIsIlRyYmMyIiwiVHJiYzEiLCJUcmFjIiwiQ2Q4YjEiLCJDZDQiKSkgKyBzY2FsZV9jb2xvdXJfZ3JhZGllbnQyKGxvdyA9ICJzdGVlbGJsdWUiLCBtaWQgPSAid2hpdGUiLCBoaWdoID0gInJlZCIpICsgdGhlbWVfZGFyayhiYXNlX3NpemUgPSAxNCkgKyBjb29yZF9mbGlwKCkKCiNSZWdyb3VwIHNwbGVuaWMgY2x1c3RlcnMKI1NpbWlsYXIgY2x1c3RlciBhcmUgYW5ub3RhdGUgYXMgb25lCklkZW50cyhULlNldXJhdC5zcGxlZW4pIDwtICJpbnRlZ3JhdGVkX3Nubl9yZXMuMS44IgpULlNldXJhdC5zcGxlZW5AbWV0YS5kYXRhJG1hbnVhbGNsdXN0ZXJzID0gIm5vdGhpbmciClQuU2V1cmF0LnNwbGVlbkBtZXRhLmRhdGFbV2hpY2hDZWxscyhULlNldXJhdC5zcGxlZW4sIHNsb3QgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEuOCIsIGlkZW50cyA9ICI0IiksXSRtYW51YWxjbHVzdGVycyA9ICI0IgpULlNldXJhdC5zcGxlZW5AbWV0YS5kYXRhW1doaWNoQ2VsbHMoVC5TZXVyYXQuc3BsZWVuLCBzbG90ID0gImludGVncmF0ZWRfc25uX3Jlcy4xLjgiLCBpZGVudHMgPSAiMSIpLF0kbWFudWFsY2x1c3RlcnMgPSAiMSIKVC5TZXVyYXQuc3BsZWVuQG1ldGEuZGF0YVtXaGljaENlbGxzKFQuU2V1cmF0LnNwbGVlbiwgc2xvdCA9ICJpbnRlZ3JhdGVkX3Nubl9yZXMuMS44IiwgaWRlbnRzID0gIjkiKSxdJG1hbnVhbGNsdXN0ZXJzID0gIjkiClQuU2V1cmF0LnNwbGVlbkBtZXRhLmRhdGFbV2hpY2hDZWxscyhULlNldXJhdC5zcGxlZW4sIHNsb3QgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEuOCIsIGlkZW50cyA9ICIxMiIpLF0kbWFudWFsY2x1c3RlcnMgPSAiMTIiClQuU2V1cmF0LnNwbGVlbkBtZXRhLmRhdGFbV2hpY2hDZWxscyhULlNldXJhdC5zcGxlZW4sIHNsb3QgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEuOCIsIGlkZW50cyA9ICIxMSIpLF0kbWFudWFsY2x1c3RlcnMgPSAiMTEiClQuU2V1cmF0LnNwbGVlbkBtZXRhLmRhdGFbV2hpY2hDZWxscyhULlNldXJhdC5zcGxlZW4sIHNsb3QgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEuOCIsIGlkZW50cyA9ICIxOSIpLF0kbWFudWFsY2x1c3RlcnMgPSAiMTkiClQuU2V1cmF0LnNwbGVlbkBtZXRhLmRhdGFbV2hpY2hDZWxscyhULlNldXJhdC5zcGxlZW4sIHNsb3QgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEuOCIsIGlkZW50cyA9ICIxMyIpLF0kbWFudWFsY2x1c3RlcnMgPSAiMTMiClQuU2V1cmF0LnNwbGVlbkBtZXRhLmRhdGFbV2hpY2hDZWxscyhULlNldXJhdC5zcGxlZW4sIHNsb3QgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEuOCIsIGlkZW50cyA9ICIxNyIpLF0kbWFudWFsY2x1c3RlcnMgPSAiMTciClQuU2V1cmF0LnNwbGVlbkBtZXRhLmRhdGFbV2hpY2hDZWxscyhULlNldXJhdC5zcGxlZW4sIHNsb3QgPSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEuOCIsIGlkZW50cyA9IGMoIjEwIiwiMTYiKSksXSRtYW51YWxjbHVzdGVycyA9ICIxMCwxNiIKVC5TZXVyYXQuc3BsZWVuQG1ldGEuZGF0YVtXaGljaENlbGxzKFQuU2V1cmF0LnNwbGVlbiwgc2xvdCA9ICJpbnRlZ3JhdGVkX3Nubl9yZXMuMS44IiwgaWRlbnRzID0gIjE1IiksXSRtYW51YWxjbHVzdGVycyA9ICIxNSIKVC5TZXVyYXQuc3BsZWVuQG1ldGEuZGF0YVtXaGljaENlbGxzKFQuU2V1cmF0LnNwbGVlbiwgc2xvdCA9ICJpbnRlZ3JhdGVkX3Nubl9yZXMuMS44IiwgaWRlbnRzID0gYygiMCIsIjUiKSksXSRtYW51YWxjbHVzdGVycyA9ICIwLDUiCmBgYAoKCiMjIERvdCBwbG90IHRoeW11cwoKU2V0dGluZyB0aHltaWMgY2x1c3RlciBvcmRlciAKYGBge3J9CklkZW50cyhULlNldXJhdC50aHltdXMpIDwtICJtYW51YWxjbHVzdGVycyIKVC5TZXVyYXQudGh5bXVzQGFjdGl2ZS5pZGVudCA8LSBmYWN0b3IoVC5TZXVyYXQudGh5bXVzQGFjdGl2ZS5pZGVudCxsZXZlbHM9YygiMjIiLCIyMSIsIjIwLDE4LDE0IiwiOCwyLDMsMjMiLCI3IiwiNiIsIjEwLDE2IiwiMTciKSkKbGV2ZWxzKFQuU2V1cmF0LnRoeW11cykKYGBgCgpgYGB7cn0KRG90UGxvdChULlNldXJhdC50aHltdXMsIGRvdC5zY2FsZSA9IDgsZmVhdHVyZXMgPSBjKCJwZXJjZW50Lm1pdG8iLCJCbWYiLCJUcnA1M2lucDEiLCJUb3gyIiwiQ2Q1IiwiQ2Q2OSIsIkNkMjciLCJSYWcxIiwiUmFnMiIsIkNkNCIsIkNkOGEiLCJDZDhiMSIsIk1raTY3IiwiQ2RrMSIsIlB0Y3JhIiwiSWwycmEiLCJDZDM0IikpICsgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3cgPSAic3RlZWxibHVlIiwgbWlkID0gIndoaXRlIiwgaGlnaCA9ICJyZWQiKSArIGNvb3JkX2ZsaXAoKSsgdGhlbWUoCiAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImdyZXk2NSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiKSwKICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKHNpemUgPSAwLjUsIGxpbmV0eXBlID0gJ3NvbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTU1IikpCmBgYAoKIyMgRG90IHBsb3Qgc3BsZWVuCgpTZXR0aW5nIHNwbGVuaWMgY2x1c3RlciBvcmRlciAKYGBge3J9CklkZW50cyhULlNldXJhdC5zcGxlZW4pIDwtICJtYW51YWxjbHVzdGVycyIKVC5TZXVyYXQuc3BsZWVuQGFjdGl2ZS5pZGVudCA8LSBmYWN0b3IoVC5TZXVyYXQuc3BsZWVuQGFjdGl2ZS5pZGVudCxsZXZlbHM9YygiMTAsMTYiLCIxIiwiNCIsIjAsNSIsIjEyIiwiMTUiLCI5IiwiMTciLCIxMyIsIjExIiwiMTkiKSkKYGBgCgpgYGB7cn0KRG90UGxvdChULlNldXJhdC5zcGxlZW4sIGRvdC5zY2FsZSA9IDgsIGZlYXR1cmVzPSBjKCJGb3hwMyIsIkFlcyIsIkFueGExIiwiR3ptYSIsIkNjbDUiLCJDeGNyMyIsIlNlbGwiLCJTMXByMSIsIkNjcjciLCJUcmRjIiwiVGNyZy1DNCIsIlRjcmctQzIiLCJUY3JnLUMxIiwiVHJiYzIiLCJUcmJjMSIsIlRyYWMiLCJDZDhiMSIsIkNkNCIpKSArIHNjYWxlX2NvbG91cl9ncmFkaWVudDIobG93ID0gInN0ZWVsYmx1ZSIsIG1pZCA9ICJ3aGl0ZSIsIGhpZ2ggPSAicmVkIikgKyB0aGVtZSgKICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JleTY1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIpLAogIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAnc29saWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NTUiKSkgKyBjb29yZF9mbGlwKCkKYGBgCgoKIyBDbHVzdGVyIElkZW50aWZpY2F0aW9uCiMjIEdlbmVyYWwgSWRlbnRpZmljYXRpb24gbWFya2VycwpgYGB7cn0KSWRlbnRzKFQuU2V1cmF0KSA8LSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEuOCIKRGVmYXVsdEFzc2F5KFQuU2V1cmF0KSA8LSAiUk5BIgojbWFya2Vyc3BsZWVuIDwtIEZpbmRBbGxNYXJrZXJzKFQuU2V1cmF0KQpgYGAKCiMjIERldGFpbGVkIGlkZW50aWZpY2F0aW9uIHsudGFic2V0IC50YWJzZXQtZmFkZX0KIyMjIENsdXN0ZXIgMApgYGB7cixmaWcud2lkdGggPSAxNSwgZmlnLmhlaWdodCA9IDR9CklkZW50cyhULlNldXJhdCkgPC0gImludGVncmF0ZWRfc25uX3Jlcy4xLjgiCkZlYXR1cmVQbG90KFQuU2V1cmF0LCBmZWF0dXJlcyA9IGMoImFkdF9DRDQiLCJTZWxsIiwiQ2Q4YjEiKSxuY29sID0gMyxjb2xzID0gYygiZ3JleSIsICJsaWdodCBibHVlIiwiY3lhbjMiLCJjeWFuNCIsImRvZGdlcmJsdWUzIiwiYmx1ZSIsIm1lZGl1bXNsYXRlYmx1ZSIsInB1cnBsZSIsIm9yY2hpZDMiLCJyZWQiLCJicm93biIsImJsYWNrIikpCmBgYAoKYGBge3IsZmlnLndpZHRoID0gMjAsIGZpZy5oZWlnaHQgPSA0fQpGZWF0dXJlUGxvdChULlNldXJhdCwgZmVhdHVyZXMgPSBjKCJDZDQiLCJDZDhiMSIpLGJsZW5kID0gVCwKYmxlbmQudGhyZXNob2xkPSAwLjQsY29scyA9IGMoImdyZXkiLCAibGlnaHQgYmx1ZSIsImN5YW4zIiwiY3lhbjQiLCJkb2RnZXJibHVlMyIsImJsdWUiLCJtZWRpdW1zbGF0ZWJsdWUiLCJwdXJwbGUiLCJvcmNoaWQzIiwicmVkIiwiYnJvd24iLCJibGFjayIpKQpgYGAKCkNsdXN0ZXIgMCBzZWVtcyB0byBjb250YWluIG5haXZlIFNQNCBjZWxscyAoQ0Q0KywgQ2Q4LSBhbmQgQ0Q2MkwtKQoKIyMjIENsdXN0ZXIgMQpgYGB7cixmaWcud2lkdGggPSAyMCwgZmlnLmhlaWdodCA9IDR9CkZlYXR1cmVQbG90KFQuU2V1cmF0LCBmZWF0dXJlcyA9IGMoImFkdF9DRDQiLCJDZDQiLCJDZDhiMSIsIlNlbGwiKSxuY29sID0gNCxjb2xzID0gYygiZ3JleSIsICJsaWdodCBibHVlIiwiY3lhbjMiLCJjeWFuNCIsImRvZGdlcmJsdWUzIiwiYmx1ZSIsIm1lZGl1bXNsYXRlYmx1ZSIsInB1cnBsZSIsIm9yY2hpZDMiLCJyZWQiLCJicm93biIsImJsYWNrIikpCmBgYAoKYGBge3IsZmlnLndpZHRoID0gMjAsIGZpZy5oZWlnaHQgPSA0fQpGZWF0dXJlUGxvdChULlNldXJhdCwgZmVhdHVyZXMgPSBjKCJDZDQiLCJDZDhiMSIpLGJsZW5kID0gVCwKYmxlbmQudGhyZXNob2xkPSAwLjQsY29scyA9IGMoImdyZXkiLCAibGlnaHQgYmx1ZSIsImN5YW4zIiwiY3lhbjQiLCJkb2RnZXJibHVlMyIsImJsdWUiLCJtZWRpdW1zbGF0ZWJsdWUiLCJwdXJwbGUiLCJvcmNoaWQzIiwicmVkIiwiYnJvd24iLCJibGFjayIpKQpgYGAKCkNsdXN0ZXIgMSBzZWVtcyB0byBjb250YWluIENEOCBuYWl2ZSBUIGNlbGxzIChDRDQtLCBDZDgrIGFuZCBDRDYyTC0pCgojIyMgQ2x1c3RlciAyCmBgYHtyLGZpZy53aWR0aCA9IDIwLCBmaWcuaGVpZ2h0ID0gNH0KRmVhdHVyZVBsb3QoVC5TZXVyYXQsIGZlYXR1cmVzID0gYygiYWR0X0NENCIsIkNkNCIsIkNkOGIxIiwiU2VsbCIpLG5jb2wgPSA0LGNvbHMgPSBjKCJncmV5IiwgImxpZ2h0IGJsdWUiLCJjeWFuMyIsImN5YW40IiwiZG9kZ2VyYmx1ZTMiLCJibHVlIiwibWVkaXVtc2xhdGVibHVlIiwicHVycGxlIiwib3JjaGlkMyIsInJlZCIsImJyb3duIiwiYmxhY2siKSkKYGBgCgpgYGB7cixmaWcud2lkdGggPSAyMCwgZmlnLmhlaWdodCA9IDR9CkZlYXR1cmVQbG90KFQuU2V1cmF0LCBmZWF0dXJlcyA9IGMoIkNkNCIsIkNkOGIxIiksYmxlbmQgPSBULApibGVuZC50aHJlc2hvbGQ9IDAuNCxjb2xzID0gYygiZ3JleSIsICJsaWdodCBibHVlIiwiY3lhbjMiLCJjeWFuNCIsImRvZGdlcmJsdWUzIiwiYmx1ZSIsIm1lZGl1bXNsYXRlYmx1ZSIsInB1cnBsZSIsIm9yY2hpZDMiLCJyZWQiLCJicm93biIsImJsYWNrIikpCmBgYAoKCkNsdXN0ZXIgMiBzZWVtcyB0byBjb250YWluIERQIGNlbGxzIChDRDQrLCBDRDgrLCBDRDYyTC0pCgojIyMgQ2x1c3RlciAzCgojIyMgQ2x1c3RlciA0CmBgYHtyLGZpZy53aWR0aCA9IDIwLCBmaWcuaGVpZ2h0ID0gNH0KRmVhdHVyZVBsb3QoVC5TZXVyYXQsIGZlYXR1cmVzID0gYygiYWR0X0NENCIsIkNkNCIsIkNkOGIxIiwiU2VsbCIpLG5jb2wgPSA0LGNvbHMgPSBjKCJncmV5IiwgImxpZ2h0IGJsdWUiLCJjeWFuMyIsImN5YW40IiwiZG9kZ2VyYmx1ZTMiLCJibHVlIiwibWVkaXVtc2xhdGVibHVlIiwicHVycGxlIiwib3JjaGlkMyIsInJlZCIsImJyb3duIiwiYmxhY2siKSkKYGBgCgpgYGB7cixmaWcud2lkdGggPSAyMCwgZmlnLmhlaWdodCA9IDR9CkZlYXR1cmVQbG90KFQuU2V1cmF0LCBmZWF0dXJlcyA9IGMoIkNkNCIsIkNkOGIxIiksYmxlbmQgPSBULApibGVuZC50aHJlc2hvbGQ9IDAuNCxjb2xzID0gYygiZ3JleSIsICJsaWdodCBibHVlIiwiY3lhbjMiLCJjeWFuNCIsImRvZGdlcmJsdWUzIiwiYmx1ZSIsIm1lZGl1bXNsYXRlYmx1ZSIsInB1cnBsZSIsIm9yY2hpZDMiLCJyZWQiLCJicm93biIsImJsYWNrIikpCmBgYAoKQ2x1c3RlciA0IHNlZW1zIHRvIGNvbnRhaW4gQ0Q4IG5haXZlIFQgY2VsbHMgKENENC0sIENkOCssIGFuZCBDRDYyTC0pCgojIyMgQ2x1c3RlciA1CmBgYHtyLGZpZy53aWR0aCA9IDE1LCBmaWcuaGVpZ2h0ID0gNH0KRmVhdHVyZVBsb3QoVC5TZXVyYXQsIGZlYXR1cmVzID0gYygiYWR0X0NENCIsIlNlbGwiLCJDZDhiMSIpLG5jb2wgPSAzLGNvbHMgPSBjKCJncmV5IiwgImxpZ2h0IGJsdWUiLCJjeWFuMyIsImN5YW40IiwiZG9kZ2VyYmx1ZTMiLCJibHVlIiwibWVkaXVtc2xhdGVibHVlIiwicHVycGxlIiwib3JjaGlkMyIsInJlZCIsImJyb3duIiwiYmxhY2siKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMjAsIGZpZy5oZWlnaHQgPSA0fQpGZWF0dXJlUGxvdChULlNldXJhdCwgZmVhdHVyZXMgPSBjKCJDZDQiLCJDZDhiMSIpLGJsZW5kID0gVCwKYmxlbmQudGhyZXNob2xkPSAwLjQsY29scyA9IGMoImdyZXkiLCAibGlnaHQgYmx1ZSIsImN5YW4zIiwiY3lhbjQiLCJkb2RnZXJibHVlMyIsImJsdWUiLCJtZWRpdW1zbGF0ZWJsdWUiLCJwdXJwbGUiLCJvcmNoaWQzIiwicmVkIiwiYnJvd24iLCJibGFjayIpKQpgYGAKCkNsdXN0ZXIgNSBzZWVtcyB0byBjb250YWluIG5haXZlIFNQNCBjZWxscyAoQ0Q0KywgQ2Q4LSBhbmQgQ0Q2MkwtKQoKIyMjIENsdXN0ZXIgNgpgYGB7cn0KRmVhdHVyZVBsb3QoVC5TZXVyYXQsIGZlYXR1cmVzID0gYygicGVyY2VudC5taXRvIiksY29scyA9IGMoImdyZXkiLCAibGlnaHQgYmx1ZSIsImN5YW4zIiwiY3lhbjQiLCJkb2RnZXJibHVlMyIsImJsdWUiLCJtZWRpdW1zbGF0ZWJsdWUiLCJwdXJwbGUiLCJvcmNoaWQzIiwicmVkIiwiYnJvd24iLCJibGFjayIpLCBwdC5zaXplID0gMSkKYGBgCkNsdXN0ZXIgNiBzZWVtcyB0byBjb250YWluIGR5aW5nIGNlbGxzCgojIyMgQ2x1c3RlciA3CmBgYHtyLGZpZy53aWR0aCA9IDE1LCBmaWcuaGVpZ2h0ID0gNH0KRmVhdHVyZVBsb3QoVC5TZXVyYXQsIGZlYXR1cmVzID0gYygiQ2Q2OSIsIkNkNSIsIlNhdGIxIiksY29scyA9IGMoImdyZXkiLCAibGlnaHQgYmx1ZSIsImN5YW4zIiwiY3lhbjQiLCJkb2RnZXJibHVlMyIsImJsdWUiLCJtZWRpdW1zbGF0ZWJsdWUiLCJwdXJwbGUiLCJvcmNoaWQzIiwicmVkIiwiYnJvd24iLCJibGFjayIpKSAjbWFya2VyIG9mIFRDUiBhY3RpdmF0aW9uIApgYGAKU2VlbXMgdG8gY29udGFpbiBjZWxscyBnb2luZyBmcm9tIERQIHRvIFNQIGJldHdlZW4gdGh5bXVzIGFuZCBzcGxlZW4KCiMjIyBDbHVzdGVyIDgKCiMjIyBDbHVzdGVyIDkKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNH0KRmVhdHVyZVBsb3QoVC5TZXVyYXQsIGZlYXR1cmVzID0gYygiQ2Q0IiwiYWR0X0NENCIpKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAyMCwgZmlnLmhlaWdodCA9IDE2fQpWbG5QbG90KFQuU2V1cmF0LnNwbGVlbiwgZmVhdHVyZXMgPSBjKCJTZWxsIiwiQ2NyNyIsIklsN3IiLCJDeGNyMyIpLG5jb2w9MikgIyBDeGNyMyBoaWdoIG9uIGVmZmVjdG9yCmBgYApTZWVtcyB0byBjb250YWluIENENCBlZmYgKENkNCssIFNlbGwtLCBDY3I3LSwgQ2QxMjctKQoKIyMjIENsdXN0ZXIgMTAKYGBge3IgY2xzdXRlcjEwfQoKYGBgCgojIyMgQ2x1c3RlciAxMQpgYGB7ciBjbHVzdGVyMTEsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNH0KRmVhdHVyZVBsb3QoVC5TZXVyYXQsIGZlYXR1cmVzID0gYygiQ2Q4YjEiLCJTZWxsIiwiQ2NsNSIsImFkdF9DRDQiKSxjb2xzID0gYygiZ3JleSIsICJsaWdodCBibHVlIiwiY3lhbjMiLCJjeWFuNCIsImRvZGdlcmJsdWUzIiwiYmx1ZSIsIm1lZGl1bXNsYXRlYmx1ZSIsInB1cnBsZSIsIm9yY2hpZDMiLCJyZWQiLCJicm93biIsImJsYWNrIikpCgpGZWF0dXJlUGxvdChULlNldXJhdCwgZmVhdHVyZXMgPSBjKCJUcmFjIiwiVHJiYzEiLCJUcmRjIiwiVGNyZy1DMSIpLGNvbHMgPSBjKCJncmV5IiwgImxpZ2h0IGJsdWUiLCJjeWFuMyIsImN5YW40IiwiZG9kZ2VyYmx1ZTMiLCJibHVlIiwibWVkaXVtc2xhdGVibHVlIiwicHVycGxlIiwib3JjaGlkMyIsInJlZCIsImJyb3duIiwiYmxhY2siKSkKYGBgCgpgYGB7cixmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDR9CkZlYXR1cmVQbG90KFQuU2V1cmF0LCBmZWF0dXJlcyA9IGMoIkx5NmMyIiwiTmtnNyIpLGNvbHMgPSBjKCJncmV5IiwgImxpZ2h0IGJsdWUiLCJjeWFuMyIsImN5YW40IiwiZG9kZ2VyYmx1ZTMiLCJibHVlIiwibWVkaXVtc2xhdGVibHVlIiwicHVycGxlIiwib3JjaGlkMyIsInJlZCIsImJyb3duIiwiYmxhY2siKSkKYGBgCgpgYGB7cixmaWcud2lkdGggPSAxNSwgZmlnLmhlaWdodCA9IDZ9ClZsblBsb3QoVC5TZXVyYXQuc3BsZWVuLCBmZWF0dXJlcyA9IGMoIlNlbGwiLCJDY3I3IiwiSWw3ciIpKQpgYGAKCkNsdXN0ZXIgMTEgU2VlbXMgdG8gY29udGFpbiBDRDggbWVtIGNlbGxzICYgc2VlbSB0byBjb250YWluIFRnZCBjZWxscyAmIEx5NmMyKwoKIyMjIENsdXN0ZXIgMTIKYGBge3IgY2x1c3RlcjEyfQpGZWF0dXJlUGxvdChULlNldXJhdCwgZmVhdHVyZXMgPSBjKCJhZHRfQ0Q0IiwiU2VsbCIsIkNkOGIxIiksY29scyA9IGMoImdyZXkiLCAibGlnaHQgYmx1ZSIsImN5YW4zIiwiY3lhbjQiLCJkb2RnZXJibHVlMyIsImJsdWUiLCJtZWRpdW1zbGF0ZWJsdWUiLCJwdXJwbGUiLCJvcmNoaWQzIiwicmVkIiwiYnJvd24iLCJibGFjayIpKQpGZWF0dXJlU2NhdHRlcihvYmplY3QgPSBULlNldXJhdCwgZmVhdHVyZTEgPSAiYWR0X0NENCIsIGZlYXR1cmUyID0gIkNEOCIsIGNlbGxzID0gY29sbmFtZXMoc3Vic2V0KFQuU2V1cmF0LCBpZGVudHMgPSAiMCIpKSwgc2xvdCA9ICJkYXRhIikKYGBgCkNsdXN0ZXIgMTIgc2VlbXMgdG8gY29udGFpbiBuYWl2ZSBTUDQgY2VsbHMgKENENCssIENkOC0gYW5kIENENjJMIC0pCgojIyMgQ2x1c3RlciAxMwpgYGB7ciBjbHVzdGVyMTMsaW5jbHVkZT1GQUxTRX0KI2xpc3RtYXJrMTMgPC0gKG1hcmtlcnNwbGVlblt3aGljaCAobWFya2Vyc3BsZWVuJGNsdXN0ZXIgPT0gIjEzIiAmIG1hcmtlcnNwbGVlbiRhdmdfbG9nRkMgPjApLCBdKSAjY2hvb3NlIGdlbmUgb3ZlcmV4cHJlc3MgaW4gY2x1c3RlciAxMyBjZWxscwojbGlzdG1hcmsxMyA8LSBsaXN0bWFyazEzJGdlbmUKCiNPbiBJbWdlbiBnZW5lIHNldCA6IElkZW50aWZ5IGFzIENEOCBhbmQvb3IgTktUCiMgVHJ5IHRvIHNlZSBpZiB3ZSBjYW4gc3ViZGl2aXNlIHRoaXMgY2x1c3RlciB0byBpZGVudGlmeSBjbGVhciBwb3B1bGF0aW9uCiNjbHVzdGVyIHN1YnNldCAxMwpJZGVudHMoVC5TZXVyYXQpIDwtICJpbnRlZ3JhdGVkX3Nubl9yZXMuMS44IgpjbHVzdGVyMTMgPC0gc3Vic2V0KFQuU2V1cmF0LCAgaWRlbnRzID0gYygiMTMiKSkKRGVmYXVsdEFzc2F5KGNsdXN0ZXIxMykgPC0gIlJOQSIgIyB0byBhdm9pZCBlcnJvciB3aGVuIHJlIHN1YnNldGluZyBodHRwczovL2dpdGh1Yi5jb20vc2F0aWphbGFiL3NldXJhdC9pc3N1ZXMvMTUyOAoKI2NsdXN0ZXIxMyA8LSBOb3JtYWxpemVEYXRhKGNsdXN0ZXIxMyxkaXNwbGF5LnByb2dyZXNzID0gRkFMU0UpCmNsdXN0ZXIxMyA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhjbHVzdGVyMTMsIGRvLnBsb3QgPSBGLCBzZWxlY3Rpb24ubWV0aG9kID0gInZzdCIsIG5mZWF0dXJlcyA9IDIwMDAsIGRpc3BsYXkucHJvZ3Jlc3MgPSBGQUxTRSkKCmNsdXN0ZXIxMyA8LSBTY2FsZURhdGEoIG9iamVjdCA9ICBjbHVzdGVyMTMsIAogICAgICAgICAgICAgICAgICAgICAgYXNzYXk9IlJOQSIsCiAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAjZG8uc2NhbGUgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGRvLmNlbnRlciA9IFRSVUUpCgoKY2x1c3RlcjEzIDwtIFJ1blBDQShvYmplY3QgPSBjbHVzdGVyMTMsIGZlYXR1cmVzID0gVmFyaWFibGVGZWF0dXJlcyhvYmplY3QgPSBjbHVzdGVyMTMpLCBucGNzID0gMTAwLCBzZWVkLnVzZSA9IDEyMzQsIHZlcmJvc2UgPSBGQUxTRSkKICAKRWxib3dQbG90KGNsdXN0ZXIxMywgbmRpbXMgPSA1MCwgcmVkdWN0aW9uID0gInBjYSIpCiAgCiAgIyBTY29yZXIgbGVzIGdlbmVzIHBvdXIgbGVzIGNvbXBvc2FudGVzCmNsdXN0ZXIxMyA8LSBQcm9qZWN0RGltKG9iamVjdCA9IGNsdXN0ZXIxMywKICAgICAgICAgICAgICAgICAgbmZlYXR1cmVzLnByaW50ID0gMjAsCiAgICAgICAgICAgICAgICAgIGRpbXMucHJpbnQgPSAxOjIwKQogIApjbHVzdGVyMTMgPC0gRmluZE5laWdoYm9ycyhvYmplY3QgPSBjbHVzdGVyMTMsCiAgICAgICAgICAgICAgICAgIGFzc2F5ID0gIlJOQSIsCiAgICAgICAgICAgICAgICAgIGRpbXMgPSAxOjIwICwgCiAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSkjLCAKICAgICAgICAgICAgICAgICAgI2ZvcmNlLnJlY2FsYyA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAjcmVkdWN0aW9uID0gInBjYSIpCiAgCmNsdXN0ZXIxMyA8LSBGaW5kQ2x1c3RlcnMob2JqZWN0ID0gY2x1c3RlcjEzLCAKICAgICAgICAgICAgICAgICAgYXNzYXkgPSAiUk5BIiwKICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiA9IDEsCiAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgcmFuZG9tLnNlZWQgPSAxMjM0KQogICNUbyBtYWtlIHRoZSBVTUFQCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICBjbHVzdGVyMTMgPC0gUnVuVU1BUChvYmplY3QgPSBjbHVzdGVyMTMsIHJlZHVjdGlvbiA9ICJwY2EiLCBzZWVkLnVzZSA9IDEyMzQsIGRpbXMgPSAxOjIwKQogICAKICAgRGltUGxvdChjbHVzdGVyMTMpCiAgIAogICBtYXJrMTMgPC0gRmluZEFsbE1hcmtlcnMoY2x1c3RlcjEzKQogICB0b3BfZ2VuZXNfZmVhdHVyZV9wbG90IDwtIG1hcmsxMyAlPiUgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIHRvcF9uKDUsIGF2Z19sb2dGQykgIyB0YWtlIDUgZmlyc3QgZ2VuZSBvZiBlYWNoIGNsdXN0ZXIKYGBgCgoKYGBge3IsZmlnLndpZHRoID0gMTUsIGZpZy5oZWlnaHQgPSA4fQpwbG90MSA8LSBEb3RQbG90KGNsdXN0ZXIxMywgZG90LnNjYWxlID0gMTAsIGZlYXR1cmVzPSBjKCJGb3hwMyIsIkFlcyIsIkFueGExIiwiR3ptYSIsIkNjbDUiLCJDeGNyMyIsIlNlbGwiLCJTMXByMSIsIkNjcjciLCJUcmRjIiwiVGNyZy1DNCIsIlRjcmctQzIiLCJUY3JnLUMxIiwiVHJiYzIiLCJUcmJjMSIsIlRyYWMiLCJDZDhiMSIsIkNkNCIpKSArIHNjYWxlX2NvbG91cl9ncmFkaWVudDIobG93ID0gInN0ZWVsYmx1ZSIsIG1pZCA9ICJ3aGl0ZSIsIGhpZ2ggPSAicmVkIikgKyB0aGVtZSgKICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JleTY1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIpLAogIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAnc29saWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NTUiKSkgKyBjb29yZF9mbGlwKCkKcGxvdDIgPC0gRG90UGxvdChjbHVzdGVyMTMsIGRvdC5zY2FsZSA9IDEwLCBmZWF0dXJlcz0gdW5pcXVlKHRvcF9nZW5lc19mZWF0dXJlX3Bsb3QkZ2VuZSkpICsgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3cgPSAic3RlZWxibHVlIiwgbWlkID0gIndoaXRlIiwgaGlnaCA9ICJyZWQiKSArIHRoZW1lKAogIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmV5NjUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSAwLjUsIGxpbmV0eXBlID0gInNvbGlkIiksCiAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShzaXplID0gMC41LCBsaW5ldHlwZSA9ICdzb2xpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk1NSIpKSArIGNvb3JkX2ZsaXAoKQpncmlkLmFycmFuZ2UocGxvdDEsIHBsb3QyLCBuY29sPTIpCiN0YWJsZShjbHVzdGVyMTNAbWV0YS5kYXRhJGludGVncmF0ZWRfc25uX3Jlcy4xKQpgYGAKVGhpcyBjbHVzdGVyIGlzIGhldGVyb2dlbmVvdXMKCiMjIyBDbHVzdGVyIDE0CmBgYHtyLGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gOH0KRmVhdHVyZVBsb3QoVC5TZXVyYXQsIGZlYXR1cmVzID0gYygiYWR0X0NENCIsIkNkNCIsIkNkOGIxIiksY29scyA9IGMoImdyZXkiLCAibGlnaHQgYmx1ZSIsImN5YW4zIiwiY3lhbjQiLCJkb2RnZXJibHVlMyIsImJsdWUiLCJtZWRpdW1zbGF0ZWJsdWUiLCJwdXJwbGUiLCJvcmNoaWQzIiwicmVkIiwiYnJvd24iLCJibGFjayIpKQpgYGAKCmBgYHtyLGZpZy53aWR0aCA9IDE1LCBmaWcuaGVpZ2h0ID0gNn0KVmxuUGxvdChULlNldXJhdCwgZmVhdHVyZXMgPSBjKCJQY25hIiwiQ2RrMSIsIk1raTY3IikpICN0ZWljaG1hbm4KYGBgCkNsdXN0ZXIgMTQgc2VlbXMgdG8gYmUgRHAgYmxhc3QKCiMjIyBDbHVzdGVyIDE1CmBgYHtyIGNsdXN0ZXIxNSwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA4fQpGZWF0dXJlUGxvdChULlNldXJhdCwgZmVhdHVyZXMgPSBjKCJhZHRfQ0Q0IiwiQ2Q0IiwiRm94cDMiLCJJbDJyYSIpLGNvbHMgPSBjKCJncmV5IiwgImxpZ2h0IGJsdWUiLCJjeWFuMyIsImN5YW40IiwiZG9kZ2VyYmx1ZTMiLCJibHVlIiwibWVkaXVtc2xhdGVibHVlIiwicHVycGxlIiwib3JjaGlkMyIsInJlZCIsImJyb3duIiwiYmxhY2siKSkKYGBgCkNsdXN0ZXIgMTUgc2VlbXMgdG8gY29udGFpbiBUcmVnIChDRDQrLCBDZDgtLCBDZDI1KywgRm94cDMrKQoKIyMjIENsdXN0ZXIgMTYKCiMjIyBDbHVzdGVyIDE3IApgYGB7ciBjbHVzdGVyMTcsZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA4fQpGZWF0dXJlUGxvdChULlNldXJhdCwgZmVhdHVyZXMgPSBjKCJhZHRfQ0Q0IiwiQ2Q4YjEiLCJUcmRjIiwiVGNyZy1DMSIpLGNvbHMgPSBjKCJncmV5IiwgImxpZ2h0IGJsdWUiLCJjeWFuMyIsImN5YW40IiwiZG9kZ2VyYmx1ZTMiLCJibHVlIiwibWVkaXVtc2xhdGVibHVlIiwicHVycGxlIiwib3JjaGlkMyIsInJlZCIsImJyb3duIiwiYmxhY2siKSkKYGBgCkNsdXN0ZXIgMTcgc2VlbSB0byBjb250YWluIFRnZCBETiAoQ0Q0LSwgQ2Q4LSwgVENSIEQrLCBUQ1IgRyspCgojIyMgQ2x1c3RlciAxOApgYGB7cixmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDh9CkZlYXR1cmVQbG90KFQuU2V1cmF0LCBmZWF0dXJlcyA9IGMoImFkdF9DRDQiLCJDZDQiLCJDZDhiMSIpLGNvbHMgPSBjKCJncmV5IiwgImxpZ2h0IGJsdWUiLCJjeWFuMyIsImN5YW40IiwiZG9kZ2VyYmx1ZTMiLCJibHVlIiwibWVkaXVtc2xhdGVibHVlIiwicHVycGxlIiwib3JjaGlkMyIsInJlZCIsImJyb3duIiwiYmxhY2siKSkKVmxuUGxvdChULlNldXJhdCwgZmVhdHVyZXMgPSBjKCJQY25hIiwiQ2RrMSIsIk1raTY3IikpICN0ZWljaG1hbm4KYGBgCkRwIGJsYXN0CgojIyMgQ2x1c3RlciAxOQpgYGB7ciwgZmlnLndpZHRoID0gMTUsIGZpZy5oZWlnaHQgPSAxMn0KRmVhdHVyZVBsb3QoVC5TZXVyYXQsIGZlYXR1cmVzID0gYygiQ2Q4YjEiLCJTZWxsIiwiQ2NsNSIsIkd6bWEiLCJLbHJjMSIsIklmbmciLCJaZWIyIiwiTHk2YzIiKSxuY29sID0gMyxjb2xzID0gYygiZ3JleSIsICJsaWdodCBibHVlIiwiY3lhbjMiLCJjeWFuNCIsImRvZGdlcmJsdWUzIiwiYmx1ZSIsIm1lZGl1bXNsYXRlYmx1ZSIsInB1cnBsZSIsIm9yY2hpZDMiLCJyZWQiLCJicm93biIsImJsYWNrIikpCiMgWmViMiB0ZXJtaW5hbGx5IGRpZmZlcmVudGlhdGVkIENUTApgYGAKCmBgYHtyLGZpZy53aWR0aCA9IDE1LCBmaWcuaGVpZ2h0ID0gNn0KVmxuUGxvdChULlNldXJhdC5zcGxlZW4sIGZlYXR1cmVzID0gYygiU2VsbCIsIkNjcjciLCJJbDdyIikpCmBgYAoKQ2x1c3RlciAxOSBzZWVtc3RvIGNvbnRhaW4gQ0Q4IENUTCAoQ0Q0LSwgQ2Q4KywgQ2NsNSssIFNlbGwtLCBjY3I3LSxjZDEyNy0pICYgTHk2YzIrCgojIyMgQ2x1c3RlciAyMApgYGB7cixmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDh9CkZlYXR1cmVQbG90KFQuU2V1cmF0LCBmZWF0dXJlcyA9IGMoImFkdF9DRDQiLCJDZDQiLCJDZDhiMSIpLGNvbHMgPSBjKCJncmV5IiwgImxpZ2h0IGJsdWUiLCJjeWFuMyIsImN5YW40IiwiZG9kZ2VyYmx1ZTMiLCJibHVlIiwibWVkaXVtc2xhdGVibHVlIiwicHVycGxlIiwib3JjaGlkMyIsInJlZCIsImJyb3duIiwiYmxhY2siKSkKVmxuUGxvdChULlNldXJhdCwgZmVhdHVyZXMgPSBjKCJQY25hIiwiQ2RrMSIsIk1raTY3IikpICN0ZWljaG1hbm4KYGBgClNlZW1zIHRvIGJlIERwIGJsYXN0CgojIyMgQ2x1c3RlciAyMQpgYGB7cixmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDR9CkZlYXR1cmVQbG90KFQuU2V1cmF0LCBmZWF0dXJlcyA9IGMoIkNkOGIxIiwiYWR0X0NENCIpKQpWbG5QbG90KFQuU2V1cmF0LCBmZWF0dXJlcyA9IGMoIkNkOGIxIiwiYWR0X0NENCIpKQpgYGAKQ2x1c3RlciAyMSBzZWVtIHRvIGNvbnRhaW4gSVNQIGNlbGxzIChDRDQtLCBDZDgrKQoKIyMjIENsdXN0ZXIgMjIKYGBge3IsZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA4fQpGZWF0dXJlUGxvdChULlNldXJhdCwgZmVhdHVyZXMgPSBjKCJhZHRfQ0Q0IiwiQ2Q0IiwiQ2Q4YjEiLCJJbDJyYSIpLGNvbHMgPSBjKCJncmV5IiwgImxpZ2h0IGJsdWUiLCJjeWFuMyIsImN5YW40IiwiZG9kZ2VyYmx1ZTMiLCJibHVlIiwibWVkaXVtc2xhdGVibHVlIiwicHVycGxlIiwib3JjaGlkMyIsInJlZCIsImJyb3duIiwiYmxhY2siKSkKYGBgCkNsdXN0ZXIgMjIgc2VlbXMgdG8gY29udGFpbiBETiBUIGNlbGxzIChDRDQtLCBDZDgtLCBDZDI1KykKCiMjIyBDbHVzdGVyIDIzCmBgYHtyLGZpZy53aWR0aCA9IDE1LCBmaWcuaGVpZ2h0ID0gM30KVmxuUGxvdChULlNldXJhdCwgZmVhdHVyZXMgPSBjKCJDZDhiMSIsImFkdF9DRDQiKSkKVmxuUGxvdChULlNldXJhdCwgZmVhdHVyZXMgPSBjKCJSYWcxIikpICNvbiBEUCBjZWxscyBtb3N0bHkgKGltbWdlbiksIERQIHF1aWNpZW50IG9yIERQIGJsYXN0IChUZWljaG1hbikKYGBgClNlZW1zIHRvIGJlIERwIHNtYWxsIChDZDQrLENkOCssUmFnMSspCgojIyBNWUMgdnMgV1QKIyMjIFJhZGFyIHBsb3QKYGBge3J9CiNjaGVjayBnZW5vdHlwZSBwcm9wb3J0aW9uIGluIGVhY2ggc3BsZWVuIGNsdXN0ZXJzCgpkZiA8LSBhcy5kYXRhLmZyYW1lKGFzLmRhdGEuZnJhbWUubWF0cml4KHQocHJvcC50YWJsZSh0YWJsZShULlNldXJhdC5zcGxlZW5AbWV0YS5kYXRhJEhUTyxULlNldXJhdC5zcGxlZW5AbWV0YS5kYXRhJG1hbnVhbGNsdXN0ZXJzKSwxKSoxMDApKSkKZGYkY2x1c3RlciA9IHJvd25hbWVzKGRmKQpkZjI8LWFzLmRhdGEuZnJhbWUodChjYmluZChyZXAoNjAsMTEpLHJlcCgwLDExKSxkZilbLDE6Nl0pKQpyb3duYW1lcyhkZjJbMToyLF0pIDwtIGMoIjYwIiwiMCIpCgojb3JkZXIgZGF0YSBmcmFtZQpkZjIgPC0gZGYyW2MoIjEwLDE2IiwiMTkiLCIxMSIsIjEzIiwiMTciLCI5IiwiMTUiLCIxMiIsIjAsNSIsIjQiLCIxIildCgpyYWRhcmNoYXJ0KGRmMiwgY2dsY29sPSJncmV5IiwgY2dsdHk9MSAsY2dsd2Q9MC44LCB2bGNleD0wLjgsIHBjb2w9YygiI0ZGOTlGRiIsImNvcmFsMSIsImN5YW4zIiwiY2hhcnRyZXVzZTMiKSAsIHBsd2Q9MywgcGx0eT0xICxjYXhpc2xhYmVscz1wYXN0ZShzZXEoZnJvbSA9IDAsdG8gPSA2MCxieSA9IDE1KSwiJSIpLCBheGlzbGFiY29sID0gImdyZXk0MCIsIGF4aXN0eXBlID0gMCkKCiNjaGVjayBnZW5vdHlwZSBwcm9wb3J0aW9uIGluIGVhY2ggdGh5bWljIGNsdXN0ZXIKZGYgPC0gIGFzLmRhdGEuZnJhbWUoYXMuZGF0YS5mcmFtZS5tYXRyaXgodChwcm9wLnRhYmxlKHRhYmxlKFQuU2V1cmF0LnRoeW11c0BtZXRhLmRhdGEkSFRPLFQuU2V1cmF0LnRoeW11c0BtZXRhLmRhdGEkbWFudWFsY2x1c3RlcnMpLDEpKjEwMCkpKQpkZiRjbHVzdGVyID0gcm93bmFtZXMoZGYpCmRmMjwtYXMuZGF0YS5mcmFtZSh0KGNiaW5kKHJlcCg2NSw4KSxyZXAoMCw4KSxkZilbLDE6Nl0pKQpyb3duYW1lcyhkZjJbMToyLF0pIDwtIGMoIjY1IiwiMCIpCgojb3JkZXIKZGYyIDwtIGRmMltjKCIyMiIsIjE3IiwiMTAsMTYiLCI2IiwiNyIsIjgsMiwzLDIzIiwiMjAsMTgsMTQiLCIyMSIpXQoKCnJhZGFyY2hhcnQoZGYyLCBjZ2xjb2w9ImdyZXkiLCBjZ2x0eT0xLGNheGlzbGFiZWxzPXBhc3RlKHNlcSgwLDcwLDE3LjUpLCIlIiksIGF4aXN0eXBlID0gMCxheGlzbGFiY29sPSJncmV5NDAiLCBjZ2x3ZD0wLjgsIHZsY2V4PTAuOCwgcGNvbD1jKCIjRkY5OUZGIiwiY29yYWwxIiwiY3lhbjMiLCJjaGFydHJldXNlMyIpICwgcGx3ZD0zLCBwbHR5PTEgKQpgYGAKIyMjIFByb3BvcnRpb24gYmFyIHBsb3QKYGBge3J9CiN0aHltaWMgcHJvcG9ydGlvbnMKZGF0YXRoeW0gPC0gZGF0YS5mcmFtZShwcm9wLnRhYmxlKHQocHJvcC50YWJsZSh0YWJsZShULlNldXJhdC50aHltdXNAbWV0YS5kYXRhJEhUTyxULlNldXJhdC50aHltdXNAbWV0YS5kYXRhJG1hbnVhbGNsdXN0ZXJzKSwxKSksMSkqMTAwKQojb3JkZXIgY2x1c3RlciBsZXZlbApkYXRhdGh5bSRWYXIxIDwtIGZhY3RvcihkYXRhdGh5bSRWYXIxLCBsZXZlbHMgPSBjKCIyMiIsIjIxIiwiMjAsMTgsMTQiLCI4LDIsMywyMyIsIjciLCI2IiwiMTAsMTYiLCIxNyIpKQoKY2VsbG51bWJlciA8LSBkYXRhLmZyYW1lKGNvbFN1bXModGFibGUoVC5TZXVyYXQudGh5bXVzQG1ldGEuZGF0YSRIVE8sVC5TZXVyYXQudGh5bXVzQG1ldGEuZGF0YSRtYW51YWxjbHVzdGVycykpICkKY2VsbG51bWJlciRjbHVzdGVyIDwtIHJvd25hbWVzKGNlbGxudW1iZXIpCnJvd19vcmRlciA8LSBjKCIyMiIsIjIxIiwiMjAsMTgsMTQiLCI4LDIsMywyMyIsIjYiLCI3IiwiMTciLCIxMCwxNiIpCmNlbGxudW1iZXIgPC0gY2VsbG51bWJlcltyb3dfb3JkZXIsXQoKQ2x1c3RlciA8LSBkYXRhdGh5bSRWYXIxCkhUTyA8LSBkYXRhdGh5bSRWYXIyClBlcmNlbnRhZ2UgPC0gZGF0YXRoeW0kRnJlcQp0ZXh0IDwtIGNlbGxudW1iZXIkY29sU3Vtcy50YWJsZS5ULlNldXJhdC50aHltdXMubWV0YS5kYXRhLkhUTy4uVC5TZXVyYXQudGh5bXVzLm1ldGEuZGF0YS5tYW51YWxjbHVzdGVycy4uCgpjb2xzIDwtIGMoIk15Yy0gUFRFTi0gdGh5bXVzIiA9ICIjRkY5OUZGIiwgIk1ZQy0gdGh5bXVzIiA9ICJjb3JhbDEiLCAiUFRFTi0gdGh5bXVzIiA9ICJjeWFuMyIsICJXVCB0aHltdXMiID0gImNoYXJ0cmV1c2UzIikKCmdncGxvdChkYXRhdGh5bSwgYWVzKGZpbGw9SFRPLCB5PVBlcmNlbnRhZ2UsIHg9Q2x1c3RlcikpICsgCiAgICBnZW9tX2Jhcihwb3NpdGlvbj0ic3RhY2siLCBzdGF0PSJpZGVudGl0eSIsIHdpZHRoPTAuNykrCiAgIHhsYWIoIlRoeW1pYyBDbHVzdGVycyIpK3lsYWIoIlBlcmNlbnRhZ2UiKSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSsgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID1jb2xzLCBsYWJlbHM9YygiTXljIFB0ZW4iLCJNeWMiLCJQdGVuIiwiV1QiKSkrdGhlbWVfbGlnaHQoKStnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9YygyNSw1MCw3NSksIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvciA9ICJncmV5NjAiKSsgYW5ub3RhdGUoInRleHQiLCB4ID0gYygxLDIsMyw0LDUsNiw3LDgpLCB5PTEwMywgbGFiZWwgPSBjKHBhc3RlMCh0ZXh0KSkpCgojc3BsZW5pYyBwcm9wb3J0aW9ucwpJZGVudHMoVC5TZXVyYXQuc3BsZWVuKSA8LSAibWFudWFsY2x1c3RlcnMiClQuU2V1cmF0LnNwbGVlbmJhciA8LSBzdWJzZXQoVC5TZXVyYXQuc3BsZWVuLCAgaWRlbnRzID0gYygiMCw1IiwiOSIsIjEiLCIxMSIsIjE5IikpICN0byBvbmx5IGtlZXAgY2x1c3RlciBuZWVkZWQgZm9yIHRoZSBwbG90CmRhdGEzIDwtIGRhdGEuZnJhbWUocHJvcC50YWJsZSh0KHByb3AudGFibGUodGFibGUoVC5TZXVyYXQuc3BsZWVuYmFyQG1ldGEuZGF0YSRIVE8sVC5TZXVyYXQuc3BsZWVuYmFyQG1ldGEuZGF0YSRtYW51YWxjbHVzdGVycyksMSkpLDEpKjEwMCkKCiNvcmRlciBjbHVzdGVyIGxldmVsCmRhdGEzJFZhcjEgPC0gZmFjdG9yKGRhdGEzJFZhcjEsIGxldmVscyA9IGMoIjAsNSIsIjkiLCIxIiwiMTEiLCIxOSIpKQoKY2VsbG51bWJlciA8LSBkYXRhLmZyYW1lKGNvbFN1bXModGFibGUoVC5TZXVyYXQuc3BsZWVuQG1ldGEuZGF0YSRIVE8sVC5TZXVyYXQuc3BsZWVuQG1ldGEuZGF0YSRtYW51YWxjbHVzdGVycykpICkKY2VsbG51bWJlciRjbHVzdGVyIDwtIHJvd25hbWVzKGNlbGxudW1iZXIpCnJvd19vcmRlciA8LWMoIjAsNSIsIjkiLCIxIiwiMTEiLCIxOSIpCmNlbGxudW1iZXIgPC0gY2VsbG51bWJlcltyb3dfb3JkZXIsXQoKQ2x1c3RlciA8LSBkYXRhMyRWYXIxCkhUTyA8LSBkYXRhMyRWYXIyClBlcmNlbnRhZ2UgPC0gZGF0YTMkRnJlcQp0ZXh0IDwtIGNlbGxudW1iZXIkY29sU3Vtcy50YWJsZS5ULlNldXJhdC5zcGxlZW4ubWV0YS5kYXRhLkhUTy4uVC5TZXVyYXQuc3BsZWVuLm1ldGEuZGF0YS5tYW51YWxjbHVzdGVycy4uCiMgU3RhY2tlZCBiYXIgcGxvdApjb2xzIDwtIGMoIk15Yy0gUFRFTi0gc3BsZWVuIiA9ICIjRkY5OUZGIiwgIk1ZQy0gc3BsZWVuIiA9ICJjb3JhbDEiLCAiUFRFTi0gc3BsZWVuIiA9ICJjeWFuMyIsICJXVCBzcGxlZW4iID0gImNoYXJ0cmV1c2UzIikKCmdncGxvdChkYXRhMywgYWVzKGZpbGw9SFRPLCB5PVBlcmNlbnRhZ2UsIHg9Q2x1c3RlcikpICsgCiAgICBnZW9tX2Jhcihwb3NpdGlvbj0ic3RhY2siLCBzdGF0PSJpZGVudGl0eSIsIHdpZHRoPTAuNykrCiAgIHhsYWIoIlNwbGVuaWMgQ2x1c3RlcnMiKSt5bGFiKCJQZXJjZW50YWdlIikrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikrc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID1jb2xzLCBsYWJlbHM9YygiTXljIFB0ZW4iLCJNeWMiLCJQdGVuIiwiV1QiKSkgK3RoZW1lX2xpZ2h0KCkrZ2VvbV9obGluZSh5aW50ZXJjZXB0PWMoMjUsNTAsNzUpLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3IgPSAiZ3JleTYwIikrIGFubm90YXRlKCJ0ZXh0IiwgeCA9IGMoMSwyLDMsNCw1KSwgeT0xMDMsIGxhYmVsID0gYyh0ZXh0KSkKYGBgCgojIyMgRGlmZmVyZW50aWFsIEdlbmUgRXhwcmVzc2lvbgojIyMjIENEOApgYGB7cn0KSWRlbnRzKFQuU2V1cmF0KSA8LSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEuOCIKI0RHRSBiZXR3ZWVuIG91ciB0d28gQ0Q4IG5haXZlIGNsdXN0ZXJzCmRnZWNkOF9kYXRhIDwtIEZpbmRNYXJrZXJzKFQuU2V1cmF0LCBpZGVudC4xID0gIjEiLCBpZGVudC4yID0gIjQiLGxvZ2ZjLnRocmVzaG9sZD0wKQoKIyBiYXIgcGxvdAojYWRkIGFicyB2YWx1ZSB0byB0YWJsZQpkZ2VjZDhfZGF0YSRhYnMgPC0gYWJzKGRnZWNkOF9kYXRhJGF2Z19sb2dGQykgCgpkZ2VjZDhfZGF0YSRnZW5lbmFtZSA8LSByb3duYW1lcyhkZ2VjZDhfZGF0YSkKIyBTZWxlY3QgbWFya2VycyBmb3IgcGxvdHRpbmcgb24gYSBIZWF0bWFwIAptYXJrZXJzLnVzZT1zdWJzZXQoZGdlY2Q4X2RhdGEsIHBfdmFsX2FkajwxZS01MCAmIGFicz4wLjIwKQpkZmNkOG1hcmtlcnMgPC1tYXJrZXJzLnVzZVtvcmRlcihtYXJrZXJzLnVzZSRhdmdfbG9nRkMpLF0KCmRmY2Q4bWFya2VycyRnZW5lbmFtZSA8LSBmYWN0b3IoZGZjZDhtYXJrZXJzJGdlbmVuYW1lLCBsZXZlbHMgPSBkZmNkOG1hcmtlcnMkZ2VuZW5hbWVbb3JkZXIoZGZjZDhtYXJrZXJzJGF2Z19sb2dGQyldKQpkZmNkOG1hcmtlcnMkbG9ncHZhbCA8LSBsb2cxMChkZmNkOG1hcmtlcnMkcF92YWxfYWRqKQoKZ2dwbG90KGRmY2Q4bWFya2VycywgYWVzKHggPSBkZmNkOG1hcmtlcnMkZ2VuZW5hbWUsIHkgPSBkZmNkOG1hcmtlcnMkYXZnX2xvZ0ZDLCBmaWxsID0gbG9ncHZhbCkpICsgICAjIEZpbGwgY29sdW1uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IC42KSArICAgIyBkcmF3IHRoZSBiYXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsaW0oLTEuMiwxLjIpKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJzKHRpdGxlPSJUcnkgZEdFIikgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZV90dWZ0ZSgpICsgICMgVHVmdGUgdGhlbWUgZnJvbSBnZ2ZvcnRpZnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSxheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9maWxsX2dyYWRpZW50Mihsb3c9J3JlZCcsIG1pZD0nb3JhbmdlJywgaGlnaD0nYmx1ZScsbWlkcG9pbnQgPSAtMTIwLCBicmVha3M9YygtNTIsLTEyMCwtMjAwKSxsYWJlbHM9YygiLTUwIiwiLTEyMCIsIi0yMDAiKSkrY29vcmRfZmxpcCgpICMgRmxpcCBheGVzCmBgYAojIyMjIENENApgYGB7cn0KI2RlZmluZSBwcm9wb3J0aW9uIG9mIGdlbm90eXBlIGluIENENCBuYWl2ZSBjbHVzdGVycwpULlNldXJhdC5zcGxlZW5AbWV0YS5kYXRhJG1hbnVhbEhUTyA9ICJub3RoaW5nIgpJZGVudHMoVC5TZXVyYXQuc3BsZWVuKSA8LSAiTVVMVElfSUQiClQuU2V1cmF0LnNwbGVlbkBtZXRhLmRhdGFbV2hpY2hDZWxscyhULlNldXJhdC5zcGxlZW4sIHNsb3QgPSAiTVVMVElfSUQiLCBpZGVudHMgPSBjKCJTcGxlZW4tY3RybCIsIlNwbGVlbi1QIikpLF0kbWFudWFsSFRPID0gIlNwbGVlbi1jdHJsJlAiClQuU2V1cmF0LnNwbGVlbkBtZXRhLmRhdGFbV2hpY2hDZWxscyhULlNldXJhdC5zcGxlZW4sIHNsb3QgPSAiTVVMVElfSUQiLCBpZGVudHMgPSBjKCJTcGxlZW4tTSIsIlNwbGVlbi1NUCIpKSxdJG1hbnVhbEhUTyA9ICJTcGxlZW4tTSZNUCIKCnByb3AudGFibGUodChwcm9wLnRhYmxlKHRhYmxlKFQuU2V1cmF0LnNwbGVlbkBtZXRhLmRhdGEkaW50ZWdyYXRlZF9zbm5fcmVzLjEuOCxULlNldXJhdC5zcGxlZW5AbWV0YS5kYXRhJG1hbnVhbEhUTyksMSkpLDIpKjEwMAojaW4gb3VyIENENCBuYWl2ZSBjbHVzdGVycyAoMCw1IGFuZCAxMikgdGhlIG9uZSB3aXRoIG1vc3QgY2VsbHMgZnJvbSBNJk1QIGlzIDAgYW5kIHRoZSBvbmUgd2l0aCBtb3N0IGNlbGxzIGZyb20gY3RybCZQIGlzIDEyCgpJZGVudHMoVC5TZXVyYXQpIDwtICJpbnRlZ3JhdGVkX3Nubl9yZXMuMS44IgojREdFIGJldHdlZW4gMCBhbmQgMTIKZGdlY2Q0X2RhdGEgPC0gRmluZE1hcmtlcnMoVC5TZXVyYXQsIGlkZW50LjEgPSAiMCIsIGlkZW50LjIgPSAiMTIiLGxvZ2ZjLnRocmVzaG9sZD0wKQojIGJhciBwbG90CiNhZGQgYWJzIHZhbHVlIHRvIHRhYmxlCmRnZWNkNF9kYXRhJGFicyA8LSBhYnMoZGdlY2Q0X2RhdGEkYXZnX2xvZ0ZDKSAKCmRnZWNkNF9kYXRhJGdlbmVuYW1lIDwtIHJvd25hbWVzKGRnZWNkNF9kYXRhKQojIFNlbGVjdCBtYXJrZXJzIGZvciBwbG90dGluZyBvbiBhIEhlYXRtYXAgCm1hcmtlcnMudXNlPXN1YnNldChkZ2VjZDRfZGF0YSxwX3ZhbF9hZGo8MWUtMTAgJiBhYnM+MC4yKQpkZmNkNG1hcmtlcnMgPC1tYXJrZXJzLnVzZVtvcmRlcihtYXJrZXJzLnVzZSRhdmdfbG9nRkMpLF0KCmRmY2Q0bWFya2VycyRnZW5lbmFtZSA8LSBmYWN0b3IoZGZjZDRtYXJrZXJzJGdlbmVuYW1lLCBsZXZlbHMgPSBkZmNkNG1hcmtlcnMkZ2VuZW5hbWVbb3JkZXIoZGZjZDRtYXJrZXJzJGF2Z19sb2dGQyldKQpkZmNkNG1hcmtlcnMkbG9ncHZhbCA8LSBsb2cxMChkZmNkNG1hcmtlcnMkcF92YWxfYWRqKQoKZ2dwbG90KGRmY2Q0bWFya2VycywgYWVzKHggPSBkZmNkNG1hcmtlcnMkZ2VuZW5hbWUsIHkgPSBkZmNkNG1hcmtlcnMkYXZnX2xvZ0ZDLCBmaWxsID0gbG9ncHZhbCkpICsgICAjIEZpbGwgY29sdW1uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IC42KSArICAgIyBkcmF3IHRoZSBiYXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsaW0oLTEuMiwxLjIpKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJzKHRpdGxlPSJUcnkgZEdFIENENCIpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWVfdHVmdGUoKSArICAjIFR1ZnRlIHRoZW1lIGZyb20gZ2dmb3J0aWZ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSksYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfZmlsbF9ncmFkaWVudDIobG93PSdyZWQnLCBtaWQ9J29yYW5nZScsIGhpZ2g9J2JsdWUnLG1pZHBvaW50ID0gLTQwLCBicmVha3M9YygtMTIsLTQwLC01NyksbGFiZWxzPWMoIi0xMCIsIi00MCIsIi02MCIpKSsgY29vcmRfZmxpcCgpICMgRmxpcCBheGVzCmBgYAoKIyMjIEZ1bmN0aW9uYWwgcHJvZmlsIGFuYWx5c2lzIChHZW5lIE9udG9sb2d5KQpgYGB7cn0KSWRlbnRzKFQuU2V1cmF0KSA8LSAiaW50ZWdyYXRlZF9zbm5fcmVzLjEuOCIKCiMgZ2V0IGFsbCBnZW5lIG5hbWUgZXhwcmVzcyBpbiBvdXIgY2VsbHMgYXMgYmFja2dyb3VuZApiYWNrZ3JvdW5kIDwtIFQuU2V1cmF0QGFzc2F5cyRSTkFAbWV0YS5mZWF0dXJlcwpiYWNrZ3JvdW5kcm93IDwtIHJvd25hbWVzKGJhY2tncm91bmQpCmBgYAoKIyMjIyBOYWl2ZSBDRDggVCBjZWxscwpgYGB7cn0KI0RHRSBiZXR3ZWVuIG91ciB0d28gQ0Q4IG5haXZlIGNsdXN0ZXJzCiNkZ2VjZDhfZGF0YSA8LSBGaW5kTWFya2VycyhULlNldXJhdCwgaWRlbnQuMSA9ICIxIiwgaWRlbnQuMiA9ICI0Iixsb2dmYy50aHJlc2hvbGQ9MCkKI3VwcmVnX2NkOCA8LSBzdWJzZXQoZGdlY2Q4X2RhdGEsIGF2Z19sb2dGQz4wKQojZG93bnJlZ19jZDggPC0gc3Vic2V0KGRnZWNkOF9kYXRhLCBhdmdfbG9nRkM8MC4yICYgcF92YWxfYWRqPDFlLTUwKQojZ2VuZWNvbXByb3cgPC0gcm93bmFtZXMoZG93bnJlZ19jZDgpCgoKIyMjIyBUTyBTVVBQUkVTUyBGT1IgRklOQUwKI3dyaXRlLnRhYmxlKGdlbmVjb21wcm93LGZpbGU9Ii9ob21lL25vemFpc20vV29ya3NwYWNlLzAxX1RoZXNlLzAxX1Byb2plY3QvTXljX1B0ZW5fUGFwZXIvY2x1c3RlcjF2NC50eHQiLHNlcD0iXHQiLHF1b3RlPUYpCmdlbmVjb21wcm93IDwtIHJlYWQudGFibGUoIi9ob21lL25vemFpc20vV29ya3NwYWNlLzAxX1RoZXNlLzAxX1Byb2plY3QvTXljX1B0ZW5fUGFwZXIvY2x1c3RlcjF2NC50eHQiLCBzZXAgPSAiXHQiKQpnZW5lY29tcHJvdyR4ID0gYXMuY2hhcmFjdGVyKGdlbmVjb21wcm93JHgpCmdlbmVjb21wcm93IDwtIGdlbmVjb21wcm93WywxXQojIyMjCgpDUGVucmljaCA8LSBlbnJpY2hHTyhnZW5lPSBnZW5lY29tcHJvdywgT3JnRGIgPSAnb3JnLk1tLmVnLmRiJywgb250PSJCUCIsa2V5VHlwZSA9ICJTWU1CT0wiLHVuaXZlcnNlID0gYmFja2dyb3VuZHJvdykgIyBvcmcuTW0uZWcuZGIgZ2Vub21lIG1vdXNlCmhlYWQgKENQZW5yaWNoKQoKZG90cGxvdChDUGVucmljaCwgc2hvd0NhdGVnb3J5PTE1LGNvbG9yID0gInAuYWRqdXN0Iix4PSJjb3VudCIpICMrIGNvb3JkX2ZsaXAoKSt0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQoKZW1hcHBsb3QoQ1BlbnJpY2gsIHNob3dDYXRlZ29yeSA9IDUwKQpgYGAKCiMjIyMgTmFpdmUgQ0Q0IFQgY2VsbHMKYGBge3J9CiNER0UgYmV0d2VlbiBvdXIgdHdvIG1vc3QgY29udHJvbCBhbmQgTXlkIGRlbCBDRDQgbmFpdmUgY2x1c3RlcnMKI2RnZWNkNF9kYXRhIDwtIEZpbmRNYXJrZXJzKFQuU2V1cmF0LCBpZGVudC4xID0gIjAiLCBpZGVudC4yID0gIjEyIixsb2dmYy50aHJlc2hvbGQ9MCkKI2Rvd25yZWdfY2Q0IDwtIHN1YnNldChkZ2VjZDRfZGF0YSwgYXZnX2xvZ0ZDPDAmIHBfdmFsX2FkajwxZS0yMCkKI2dlbmVjb21wcm93IDwtIHJvd25hbWVzKGRvd25yZWdfY2Q0KQoKCiMjIyMgVE8gU1VQUFJFU1MgRk9SIEZJTkFMCiN3cml0ZS50YWJsZShnZW5lY29tcHJvdyxmaWxlPSIvaG9tZS9ub3phaXNtL1dvcmtzcGFjZS8wMV9UaGVzZS8wMV9Qcm9qZWN0L015Y19QdGVuX1BhcGVyL2NsdXN0ZXIwdnMxMi50eHQiLHNlcD0iXHQiLHF1b3RlPUYpCmdlbmVjb21wcm93IDwtIHJlYWQudGFibGUoIi9ob21lL25vemFpc20vV29ya3NwYWNlLzAxX1RoZXNlLzAxX1Byb2plY3QvTXljX1B0ZW5fUGFwZXIvY2x1c3RlcjF2NC50eHQiLCBzZXAgPSAiXHQiKQpnZW5lY29tcHJvdyR4ID0gYXMuY2hhcmFjdGVyKGdlbmVjb21wcm93JHgpCmdlbmVjb21wcm93IDwtIGdlbmVjb21wcm93WywxXQojIyMjCgoKQ1BlbnJpY2ggPC0gZW5yaWNoR08oZ2VuZT0gZ2VuZWNvbXByb3csIE9yZ0RiID0gJ29yZy5NbS5lZy5kYicsIG9udD0iQlAiLGtleVR5cGUgPSAiU1lNQk9MIix1bml2ZXJzZSA9IGJhY2tncm91bmRyb3cpICMgb3JnLk1tLmVnLmRiIGdlbm9tZSBtb3VzZQoKZG90cGxvdChDUGVucmljaCwgc2hvd0NhdGVnb3J5PTE1LGNvbG9yID0gInAuYWRqdXN0Iix4PSJjb3VudCIpCmBgYAoKIyMjIGVZRlAgbmVnYXRpdmUgaW52ZXN0aWdhdGlvbgpEZWNpcGhlcmluZyB3aGF0IGFyZSBvdXIgZVlGUCBuZWdhdGl2ZSBjZWxscyBvbiBlZmZlY3RvciBhbmQgbWVtb3J5IENEOCBUIGNlbGxzCgpIZWF0bWFwIDogCmBgYHtyfQojIE9uIGNsdXN0ZXIgMTEgLSBjZDggbWVtb3J5CkMxMUN0cmwgPC1yb3duYW1lcyhULlNldXJhdC5zcGxlZW5AbWV0YS5kYXRhW1QuU2V1cmF0LnNwbGVlbkBtZXRhLmRhdGEkTVVMVElfSUQgPT0gIlNwbGVlbi1jdHJsIiAmIFQuU2V1cmF0LnNwbGVlbkBtZXRhLmRhdGEkaW50ZWdyYXRlZF9zbm5fcmVzLjEuOCA9PSAiMTEiLF0pCm1DMTFDdHJsIDwtIG1lYW4oVC5TZXVyYXQuc3BsZWVuQGFzc2F5cyRSTkFAZGF0YVsiZVlGUCIsQzExQ3RybF0pCkMxMVB0IDwtIHJvd25hbWVzKFQuU2V1cmF0LnNwbGVlbkBtZXRhLmRhdGFbVC5TZXVyYXQuc3BsZWVuQG1ldGEuZGF0YSRNVUxUSV9JRCA9PSAiU3BsZWVuLVAiICYgVC5TZXVyYXQuc3BsZWVuQG1ldGEuZGF0YSRpbnRlZ3JhdGVkX3Nubl9yZXMuMS44ID09ICIxMSIsXSkKbUMxMVB0IDwtIG1lYW4oVC5TZXVyYXQuc3BsZWVuQGFzc2F5cyRSTkFAZGF0YVsiZVlGUCIsQzExUHRdKQpDMTFNUCA8LSByb3duYW1lcyhULlNldXJhdC5zcGxlZW5AbWV0YS5kYXRhW1QuU2V1cmF0LnNwbGVlbkBtZXRhLmRhdGEkTVVMVElfSUQgPT0gIlNwbGVlbi1NUCIgJiBULlNldXJhdC5zcGxlZW5AbWV0YS5kYXRhJGludGVncmF0ZWRfc25uX3Jlcy4xLjggPT0gIjExIixdKQptQzExTVAgPC0gbWVhbihULlNldXJhdC5zcGxlZW5AYXNzYXlzJFJOQUBkYXRhWyJlWUZQIixDMTFNUF0pCkMxMU0gPC0gcm93bmFtZXMoVC5TZXVyYXQuc3BsZWVuQG1ldGEuZGF0YVtULlNldXJhdC5zcGxlZW5AbWV0YS5kYXRhJE1VTFRJX0lEID09ICJTcGxlZW4tTSIgJiBULlNldXJhdC5zcGxlZW5AbWV0YS5kYXRhJGludGVncmF0ZWRfc25uX3Jlcy4xLjggPT0gIjExIixdKQptQzExTSA8LSBtZWFuKFQuU2V1cmF0LnNwbGVlbkBhc3NheXMkUk5BQGRhdGFbImVZRlAiLEMxMU1dKQojb24gY2x1c3RlciAxOSAtIGNkOCBlZmYgdGVybQpDMTlDdHJsIDwtcm93bmFtZXMoVC5TZXVyYXQuc3BsZWVuQG1ldGEuZGF0YVtULlNldXJhdC5zcGxlZW5AbWV0YS5kYXRhJE1VTFRJX0lEID09ICJTcGxlZW4tY3RybCIgJiBULlNldXJhdC5zcGxlZW5AbWV0YS5kYXRhJGludGVncmF0ZWRfc25uX3Jlcy4xLjggPT0gIjE5IixdKQptQzE5Q3RybCA8LSBtZWFuKFQuU2V1cmF0LnNwbGVlbkBhc3NheXMkUk5BQGRhdGFbImVZRlAiLEMxOUN0cmxdKQpDMTlQdCA8LSByb3duYW1lcyhULlNldXJhdC5zcGxlZW5AbWV0YS5kYXRhW1QuU2V1cmF0LnNwbGVlbkBtZXRhLmRhdGEkTVVMVElfSUQgPT0gIlNwbGVlbi1QIiAmIFQuU2V1cmF0LnNwbGVlbkBtZXRhLmRhdGEkaW50ZWdyYXRlZF9zbm5fcmVzLjEuOCA9PSAiMTkiLF0pCm1DMTlQdCA8LSBtZWFuKFQuU2V1cmF0LnNwbGVlbkBhc3NheXMkUk5BQGRhdGFbImVZRlAiLEMxOVB0XSkKQzE5TVAgPC0gcm93bmFtZXMoVC5TZXVyYXQuc3BsZWVuQG1ldGEuZGF0YVtULlNldXJhdC5zcGxlZW5AbWV0YS5kYXRhJE1VTFRJX0lEID09ICJTcGxlZW4tTVAiICYgVC5TZXVyYXQuc3BsZWVuQG1ldGEuZGF0YSRpbnRlZ3JhdGVkX3Nubl9yZXMuMS44ID09ICIxOSIsXSkKbUMxOU1QIDwtIG1lYW4oVC5TZXVyYXQuc3BsZWVuQGFzc2F5cyRSTkFAZGF0YVsiZVlGUCIsQzE5TVBdKQpDMTlNIDwtIHJvd25hbWVzKFQuU2V1cmF0LnNwbGVlbkBtZXRhLmRhdGFbVC5TZXVyYXQuc3BsZWVuQG1ldGEuZGF0YSRNVUxUSV9JRCA9PSAiU3BsZWVuLU0iICYgVC5TZXVyYXQuc3BsZWVuQG1ldGEuZGF0YSRpbnRlZ3JhdGVkX3Nubl9yZXMuMS44ID09ICIxOSIsXSkKbUMxOU0gPC0gbWVhbihULlNldXJhdC5zcGxlZW5AYXNzYXlzJFJOQUBkYXRhWyJlWUZQIixDMTlNXSkKI29uIGNsdXN0ZXIgMQpDMUN0cmwgPC1yb3duYW1lcyhULlNldXJhdC5zcGxlZW5AbWV0YS5kYXRhW1QuU2V1cmF0LnNwbGVlbkBtZXRhLmRhdGEkTVVMVElfSUQgPT0gIlNwbGVlbi1jdHJsIiAmIFQuU2V1cmF0LnNwbGVlbkBtZXRhLmRhdGEkaW50ZWdyYXRlZF9zbm5fcmVzLjEuOCA9PSAiMSIsXSkKbUMxQ3RybCA8LSBtZWFuKFQuU2V1cmF0LnNwbGVlbkBhc3NheXMkUk5BQGRhdGFbImVZRlAiLEMxQ3RybF0pCkMxUHQgPC0gcm93bmFtZXMoVC5TZXVyYXQuc3BsZWVuQG1ldGEuZGF0YVtULlNldXJhdC5zcGxlZW5AbWV0YS5kYXRhJE1VTFRJX0lEID09ICJTcGxlZW4tUCIgJiBULlNldXJhdC5zcGxlZW5AbWV0YS5kYXRhJGludGVncmF0ZWRfc25uX3Jlcy4xLjggPT0gIjEiLF0pCm1DMVB0IDwtIG1lYW4oVC5TZXVyYXQuc3BsZWVuQGFzc2F5cyRSTkFAZGF0YVsiZVlGUCIsQzFQdF0pCkMxTVAgPC0gcm93bmFtZXMoVC5TZXVyYXQuc3BsZWVuQG1ldGEuZGF0YVtULlNldXJhdC5zcGxlZW5AbWV0YS5kYXRhJE1VTFRJX0lEID09ICJTcGxlZW4tTVAiICYgVC5TZXVyYXQuc3BsZWVuQG1ldGEuZGF0YSRpbnRlZ3JhdGVkX3Nubl9yZXMuMS44ID09ICIxIixdKQptQzFNUCA8LSBtZWFuKFQuU2V1cmF0LnNwbGVlbkBhc3NheXMkUk5BQGRhdGFbImVZRlAiLEMxTVBdKQpDMU0gPC0gcm93bmFtZXMoVC5TZXVyYXQuc3BsZWVuQG1ldGEuZGF0YVtULlNldXJhdC5zcGxlZW5AbWV0YS5kYXRhJE1VTFRJX0lEID09ICJTcGxlZW4tTSIgJiBULlNldXJhdC5zcGxlZW5AbWV0YS5kYXRhJGludGVncmF0ZWRfc25uX3Jlcy4xLjggPT0gIjEiLF0pCm1DMU0gPC0gbWVhbihULlNldXJhdC5zcGxlZW5AYXNzYXlzJFJOQUBkYXRhWyJlWUZQIixDMU1dKQoKCmwxIDwtIGMoIjEiLCIxIiwiMSIsIjEiLCIxMSIsIjExIiwiMTEiLCIxMSIsIjE5IiwiMTkiLCIxOSIsIjE5IikKbDIgPC0gYygiQ3RybCIsIlB0ZW4iLCJNeWMiLCJNeWNQdGVuIiwiQ3RybCIsIlB0ZW4iLCJNeWMiLCJNeWNQdGVuIiwiQ3RybCIsIlB0ZW4iLCJNeWMiLCJNeWNQdGVuIikKbDMgPC0gYyhtQzFDdHJsLG1DMVB0LG1DMU0sbUMxTVAsbUMxMUN0cmwsbUMxMVB0LG1DMTFNLG1DMTFNUCxtQzE5Q3RybCxtQzE5UHQsbUMxOU0sbUMxOU1QKQoKdGFibGVhdVlGUCA8LSBkYXRhLmZyYW1lKENsdXN0ZXIgPSBsMSwgR2Vub3R5cGVzID1sMikgCnRhYmxlYXVZRlAgPC0gY2JpbmQodGFibGVhdVlGUCxWYWx1ZXMgPSBsMykKCgp0YWJsZWF1WUZQJENsdXN0ZXIgPC0gZmFjdG9yKHRhYmxlYXVZRlAkQ2x1c3RlcixsZXZlbHMgPSBjKCIxIiwiMTEiLCIxOSIpKQp0YWJsZWF1WUZQJEdlbm90eXBlcyA8LSBmYWN0b3IodGFibGVhdVlGUCRHZW5vdHlwZXMsbGV2ZWxzID0gYygiTXljUHRlbiIsIk15YyIsIlB0ZW4iLCJDdHJsIikpCmBgYAoKYGBge3J9CmdncGxvdCh0YWJsZWF1WUZQLCBhZXMoeCA9IENsdXN0ZXIsIEdlbm90eXBlcykpICsKICAgICAgICBnZW9tX3RpbGUoYWVzKGZpbGwgPSBWYWx1ZXMpKSArCiAgICAgICAgc2NhbGVfZmlsbF9ncmFkaWVudDIoIG1pZD0neWVsbG93JywgaGlnaD0ncmVkJyxsaW1pdHM9YygwLG1heCh0YWJsZWF1WUZQJFZhbHVlcykpKSsgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemU9MjApCmBgYAoKZVlGUCBuZWFndGl2ZSBhcmUgY29taW5nIGZyb20gTXljIGFuZCBNeWMgUHRlbiBkZWwgbWljZQoKYGBge3J9CiNET1QgcGxvdCBleUZQIGFuZCBUR0Qgb24gQ0Q4IGVmZmVjdG9yIGFuZCBtZW1vcnkKSWRlbnRzKFQuU2V1cmF0LnNwbGVlbikgPC0gImludGVncmF0ZWRfc25uX3Jlcy4xLjgiCkNEOHN1YiA8LSBzdWJzZXQoVC5TZXVyYXQuc3BsZWVuLCBpZGVudHMgPSBjKCIxMSIsIjE5IiwiMTMiKSkKSWRlbnRzKENEOHN1YikgPC0gIk1VTFRJX0lEIgpDRDhzdWJAYWN0aXZlLmlkZW50IDwtIGZhY3RvcihDRDhzdWJAYWN0aXZlLmlkZW50LGxldmVscz1jKCJTcGxlZW4tTSIsIlNwbGVlbi1NUCIsIlNwbGVlbi1jdHJsIiwiU3BsZWVuLVAiKSkKbGV2ZWxzKENEOHN1YikKYGBgCgpgYGB7cn0KRG90UGxvdChDRDhzdWIsIGRvdC5zY2FsZSA9IDgsZmVhdHVyZXMgPSBjKCJUY3JnLUMxIiwiVHJkYyIsIlRyYmMyIiwiVHJhYyIsImVZRlAiKSApICsgc2NhbGVfY29sb3VyX2dyYWRpZW50Mihsb3cgPSAic3RlZWxibHVlIiwgbWlkID0gIndoaXRlIiwgaGlnaCA9ICJyZWQiKSsgZ2d0aXRsZSgiQ0Q4IG1lbW9yeSBhbmQgZWZmZWN0b3IgY2x1c3RlcnMiKQpgYGAKZXlGUCBuZWdhdGl2ZSBhcmUgY29taW5nIGZyb20gTXljIGFuZCBNeWMgUHRlbiBkZWwgbWljZSBhbmQgYXJlIFRnZCBjZWxscy4KCiNTZXNzaW9uIEluZm8KYGBge3J9CnNlc3Npb25JbmZvKCkKYGBgCgo=